2017-05-27 58 views
0

对不起我只是没有做横向连接!PostgreSQL横向连接到极限组

我有这样的一个表:

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 

现在我想拿到第2行通过降低VALUE的顺序排序每个号码。

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元素的所有行。

回答

2

。利用窗口分析功能的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,将assing rno秩序desc每个number组。然后在外部查询中,您可以选择rno <= 2以获取您的输出。

+0

谢谢!这是行得通的。 – BenWhite