gpt4 book ai didi

sql - 如何查找按两列分组的列的先前值?

转载 作者:行者123 更新时间:2023-11-29 14:08:20 27 4
gpt4 key购买 nike

我想从下表中找到按 fname 和 lname 分组的新代码和以前的代码。

fname | lname | code |
----------------------
jack | jonas | 987 |
nick | fun | 563 |
jack | jonas | 674 |
jack | jonas | 672 |

输出表:

fname | lname | new_code | prev_code |
-------------------------------------
jack | jonas | 987 | 674

PS:我的案例不支持“distinct on”。我想可以使用 left join 或 pivot。

最佳答案

在 Postgres 中,您可以使用 distinct onlag() 获取每个名称的最新对:

select distinct on (lname, fname) t.*
from (select t.*,
lag(code) over (partition by lname, fname order by datecol) as prev_code
from t
) t
where prev_code is not null
order by lname, fname, date desc;

你也可以在没有子查询的情况下这样做:

select distinct lname, fname,
first_value(code) over (partition by lname, fname order by datecol desc),
nth_value(code, 2) over (partition by lname, fname order by datecol desc)
from t;

但是,当第二个代码存在时,您仍然需要一个子查询来过滤值。

或者,您可以使用数组:

select lname, fname,
(array_agg(code order by datecol desc))[1] as code,
(array_agg(code order by datecol desc))[2] as prev_code
from t
group by lname, fname
having count(*) >= 2;

关于sql - 如何查找按两列分组的列的先前值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56833283/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com