PostgreSQL LATERAL加入限制组

时间:2017-05-27 05:26:40

标签: sql postgresql join

对不起,我只是没有做横向加入!

我有一张这样的桌子:

ID | NUMBER | VALUE
-------------------
20 | 12     | 0.7
21 | 12     | 0.8
22 | 13     | 0.8
23 | 13     | 0.7
24 | 13     | 0.9
25 | Null   | 0.9

现在我想按每个NUMBER的前两行排序,按降序排序。

ID | NUMBER | VALUE
-------------------
21 | 12     | 0.8
20 | 12     | 0.7
24 | 13     | 0.9
22 | 13     | 0.8

我到目前为止尝试的代码如下所示: (发现:Grouped LIMIT in PostgreSQL: show the first N rows for each group?

SELECT DISTINCT t_outer.id, t_top.number, t_top.value
FROM table t_outer
JOIN LATERAL (
     SELECT * FROM table t_inner
    WHERE t_inner.number NOTNULL
    AND t_inner.id = t_outer.id
    AND t_inner.number = t_outer.number
    ORDER BY t_inner.value DESC
    LIMIT 2
     ) t_top ON TRUE
order by t_outer.value DESC;

到目前为止一切都很好,看起来LIMIT 2似乎没有用。我得到了所有NUMBER个元素的所有行。

1 个答案:

答案 0 :(得分:2)

使用Windows分析函数row_number

Rextester Demo

select "ID", "NUMBER", "VALUE" from 
(select t.*
 ,row_number() over (partition by "NUMBER" 
                     order by "VALUE" desc
                    ) as rno
from table1 t
) t1
where t1.rno <=2;

输出

ID  NUMBER  VALUE
21  12      0,8000
20  12      0,7000
24  13      0,9000
22  13      0,8000
25  NULL    0,9000

说明:

内部查询t1将按rno desc为每个value组提供number订单。然后在外部查询中,您可以选择rno <= 2来获取输出。