Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function)
От | matshyeq |
---|---|
Тема | Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function) |
Дата | |
Msg-id | CAONr5=s+8q36Wmo_LVyUgy7gjo-SCfviYJ556Uvr-T_ss_w7mg@mail.gmail.com обсуждение исходный текст |
Ответы |
Re: Enhancement request: enable FIRST/LAST_value() also as a regular aggregate (not only as windowing function)
Re: Enhancement request: enable FIRST/LAST_value() also as a regularaggregate (not only as windowing function) |
Список | pgsql-hackers |
SELECT t.* ,FIRST_value(v1)OVER(PARTITION BY gid ORDER BY v2) fv ,LAST_value(v1)OVER(PARTITION BY gid ORDER BY v2 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) lv FROM( VALUES (1, 'b', 3),(1, 'd', 1),(1, 'a', 2) ,(2, 'x', 7),(2, 'y', 9),(2, 'z', 8),(2, 'v', 9)) t (gid, v1, v2);
gid | v1 | v2 | fv | lv |
---|
1 | d | 1 | d | b |
1 | a | 2 | d | b |
1 | b | 3 | d | b |
2 | x | 7 | x | v |
2 | z | 8 | x | v |
2 | y | 9 | x | v |
2 | v | 9 | x | v |
but, given those values are repeating - why can't I simply use this functions as regular aggregates?
Am I missing some workaround here?
WITH t(gid, v1, v2) AS(
SELECT 1, 'b', 3 FROM dual UNION ALL
SELECT 1, 'd', 1 FROM dual UNION ALL
SELECT 1, 'a', 2 FROM dual UNION ALL
SELECT 2, 'x', 7 FROM dual UNION ALL
SELECT 2, 'y', 9 FROM dual UNION ALL
SELECT 2, 'z', 8 FROM dual UNION ALL
SELECT 2, 'v', 9 FROM dual --UNION ALL
)
SELECT t.*
,MIN(v1)KEEP(DENSE_RANK FIRST ORDER BY v2) OVER(PARTITION BY gid) lkp_first
,MIN(v1)KEEP(DENSE_RANK LAST ORDER BY v2) OVER(PARTITION BY gid) lkp_lastMin
,MAX(v1)KEEP(DENSE_RANK LAST ORDER BY v2) OVER(PARTITION BY gid) lkp_lastMax
FROM t;
GID | V1 | V2 | LKP_FIRST | LKP_LASTMIN | LKP_LASTMAX |
---|
1 | a | 2 | d | b | b |
1 | d | 1 | d | b | b |
1 | b | 3 | d | b | b |
2 | z | 8 | x | v | y |
2 | y | 9 | x | v | y |
2 | v | 9 | x | v | y |
2 | x | 7 | x | v | y |
WITH t(gid, v1, v2) AS(
SELECT 1, 'b', 3 FROM dual UNION ALL
SELECT 1, 'd', 1 FROM dual UNION ALL
SELECT 1, 'a', 2 FROM dual UNION ALL
SELECT 2, 'x', 7 FROM dual UNION ALL
SELECT 2, 'y', 9 FROM dual UNION ALL
SELECT 2, 'z', 8 FROM dual UNION ALL
SELECT 2, 'v', 9 FROM dual --UNION ALL
)
SELECT t.gid
,MIN(v1)KEEP(DENSE_RANK FIRST ORDER BY v2)lkp_first
,MIN(v1)KEEP(DENSE_RANK LAST ORDER BY v2)lkp_lastMin
,MAX(v1)KEEP(DENSE_RANK LAST ORDER BY v2)lkp_lastMax
FROM t
GROUP BY t.gid;
GID | LKP_FIRST | LKP_LASTMIN | LKP_LASTMAX |
---|
1 | d | b | b |
2 | x | v | y |
В списке pgsql-hackers по дате отправления: