last_value()和分组依据

时间:2019-04-27 11:24:30

标签: sql postgresql

我有记录集:

lvl | root_id | id
 1  |   3000  | 5000
 2  |   3000  | 5100
 2  |   3000  | 5110
 3  |   3000  | 5200

我需要按root_id组数据进行分组,并为每个id获得root_id的值,最大值为lvl

  root_id | id 
    3000  | 5200

类似的东西:

SELECT root_id, last_value(id) over (partition by root_id order by last lvl)
FROM t
GROUP BY root_id;

但是我得到了错误:

  

t.id列必须出现在GROUPO BY子句中或在聚合函数中使用。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

您可以使用DISTINCT ON

SELECT DISTINCT ON (root_id) root_id, id
FROM t
ORDER BY root_id, lvl DESC, id DESC

db<>fiddle demo

答案 1 :(得分:2)

您可以尝试使用ROW_NUMBER窗口功能。

查询1

SELECT root_id , id 
FROM (
    SELECT *, ROW_NUMBER() OVER(partition by root_id order by lvl desc) rn
    FROM t
) t1
WHERE rn = 1

Results

| root_id |   id |
|---------|------|
|    3000 | 5200 |