提问人:idiocache 提问时间:11/16/2023 最后编辑:idiocache 更新时间:11/16/2023 访问量:58
如何在SQL中识别组中“最新”行满足某个条件的行组?
How to identify groups of rows in SQL where the "latest" row in the group meets a certain condition?
问:
让我们想象一下我有这张表:
zone_id | subzone_id | 新近度 | 操作 |
---|---|---|---|
801 | 01 | 0 | 1 |
801 | 01 | 1 | 1 |
第13页 | 01 | 6 | 0 |
第13页 | 01 | 7 | 1 |
我根据 和 对此表中的行进行分组。在这些列中共享相同值的行被视为属于同一组。zone_id
subzone_id
因此,在上面的示例中,前两行属于一个组 (),后两行属于另一个组 (A
B
)
我试图做的(但惨遭失败)是只保留组,其中组中最低的行的行不等于 0。recency
operation
因此,在上面的示例中,组将被删除,因为该组中最低 (6) 的行确实等于 0。B
recency
operation
因此,应仅保留以下组:A
zone_id | subzone_id | 新近度 | 操作 |
---|---|---|---|
801 | 01 | 0 | 1 |
801 | 01 | 1 | 1 |
我尝试在我的解决方案中使用 GROUP BY 和 ROW_NUMBER,但我就是无法做到这一点。
答:
2赞
Stu
11/16/2023
#1
您可以使用first_value窗口功能:
with o as (
select *,
First_Value(operation)
over(partition by zone_id, subzone_id order by recency, operation) op
from t
)
select *
from o
where op != 0;
评论
1赞
idiocache
11/16/2023
这正是我需要但不知道存在的功能。直截了当的回答,高度赞赏(特别是考虑到上面对我原始问题的无用评论)。谢谢。
0赞
Saikat
11/16/2023
#2
这是在不使用任何窗口函数的情况下使用 SQL Server 的解决方案。一种正常的方法。
with cte AS
(
select zone_id , subzone_id , min(recency) as min_recency from tbl_zone as a
group by zone_id , subzone_id
)
select a.* from tbl_zone as a INNER JOIN
(
select a.zone_id , a.subzone_id , a.min_recency , b.operation
from cte as a INNER JOIN tbl_zone as b on
a.zone_id = b.zone_id and a.subzone_id = b.subzone_id and a.min_recency = b.recency
and b.operation <> 0
) as b on a.zone_id = b.zone_id and a.subzone_id = b.subzone_id;
评论
recency