如何在 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()

Online example

您不需要为此使用循环或 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 获取两行。