如何在SQL中识别组中“最新”行满足某个条件的行组?

How to identify groups of rows in SQL where the "latest" row in the group meets a certain condition?

提问人:idiocache 提问时间:11/16/2023 最后编辑:idiocache 更新时间:11/16/2023 访问量:58

问:

让我们想象一下我有这张表:

zone_id subzone_id 新近度 操作
801 01 0 1
801 01 1 1
第13页 01 6 0
第13页 01 7 1

我根据 和 对此表中的行进行分组。在这些列中共享相同值的行被视为属于同一组。zone_idsubzone_id

因此,在上面的示例中,前两行属于一个组 (),后两行属于另一个组 (AB)

我试图做的(但惨遭失败)是只保留组,其中组中最低的行的行不等于 0。recencyoperation

因此,在上面的示例中,组将被删除,因为该组中最低 (6) 的行确实等于 0。Brecencyoperation

因此,应仅保留以下组:A

zone_id subzone_id 新近度 操作
801 01 0 1
801 01 1 1

我尝试在我的解决方案中使用 GROUP BY 和 ROW_NUMBER,但我就是无法做到这一点。

SQL格式

评论

0赞 PM 77-1 11/16/2023
在团队是独一无二的吗?recency
0赞 Eric 11/16/2023
那么这是哪个dbms???
1赞 Eric 11/16/2023
“我尝试在我的解决方案中使用 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;