如何在 table 中迭代不同的日期
How to iterate over distinct dates in a table
我有以下 table:
id
date
gap
1
2020-01-01
3
2
2020-01-01
5
3
2020-01-01
8
4
2020-01-02
6
5
2020-01-02
10
6
2020-01-02
12
我想遍历不同的日期并获取具有最高“差距”值的两行。期望的结果:
id
date
gap
2
2020-01-01
5
3
2020-01-01
8
5
2020-01-02
10
6
2020-01-02
12
我尝试了以下
DO $$
DECLARE
temprow record;
BEGIN
FOR temprow in
SELECT DISTINCT date
FROM table
LOOP
SELECT *
FROM table
ORDER BY gap DESC
LIMIT 2;
END LOOP;
END;
$$;
给我以下错误:
ERROR: query has no destination for result data.
用 RETURN() 包装最后一个 SELECT 语句给出:
ERROR: RETURN cannot have a parameter in function returning void
我不确定我是否需要一个循环,所以请随意提出一个没有循环的解决方案。
这可以使用 window 函数来完成:
select id, "date", gap
from (
select id, "date", gap,
dense_rank() over (partition by "date" order by gap desc) as rnk
from the_table
) t
where rnk <= 2
order by "date", gap;
如果同一日期有两行具有相同(最高)的差距,则两者都将被返回。如果您不想那样,请使用 row_number()
而不是 dense_rank()
您不需要为此使用循环或 plpgsql。
select l.* from
(
select distinct "date" as dd from the_table
) t
cross join lateral
(
select * from the_table
where "date" = t.dd order by gap desc limit 2
) l
order by "date", gap;
几乎是通俗易懂的语言 - 对于每个不同的日期 dd
获取两行。
我有以下 table:
id | date | gap |
---|---|---|
1 | 2020-01-01 | 3 |
2 | 2020-01-01 | 5 |
3 | 2020-01-01 | 8 |
4 | 2020-01-02 | 6 |
5 | 2020-01-02 | 10 |
6 | 2020-01-02 | 12 |
我想遍历不同的日期并获取具有最高“差距”值的两行。期望的结果:
id | date | gap |
---|---|---|
2 | 2020-01-01 | 5 |
3 | 2020-01-01 | 8 |
5 | 2020-01-02 | 10 |
6 | 2020-01-02 | 12 |
我尝试了以下
DO $$
DECLARE
temprow record;
BEGIN
FOR temprow in
SELECT DISTINCT date
FROM table
LOOP
SELECT *
FROM table
ORDER BY gap DESC
LIMIT 2;
END LOOP;
END;
$$;
给我以下错误:
ERROR: query has no destination for result data.
用 RETURN() 包装最后一个 SELECT 语句给出:
ERROR: RETURN cannot have a parameter in function returning void
我不确定我是否需要一个循环,所以请随意提出一个没有循环的解决方案。
这可以使用 window 函数来完成:
select id, "date", gap
from (
select id, "date", gap,
dense_rank() over (partition by "date" order by gap desc) as rnk
from the_table
) t
where rnk <= 2
order by "date", gap;
如果同一日期有两行具有相同(最高)的差距,则两者都将被返回。如果您不想那样,请使用 row_number()
而不是 dense_rank()
您不需要为此使用循环或 plpgsql。
select l.* from
(
select distinct "date" as dd from the_table
) t
cross join lateral
(
select * from the_table
where "date" = t.dd order by gap desc limit 2
) l
order by "date", gap;
几乎是通俗易懂的语言 - 对于每个不同的日期 dd
获取两行。