情况...对于子组

case when... for subgroups

我有 table 这样的:

收据 位置 单位 预约时间
1 1 1 08:00:00
1 2 1 08:00:05
1 3 1 08:00:11
1 4 1 08:00:18
1 5 1 08:00:21
1 6 5 08:00:25
1 1 1 08:00:30
1 2 1 08:00:33
1 3 1 08:00:37
1 4 1 08:00:40
1 5 1 08:00:49
2 1 1 08:01:55
2 2 1 08:01:58
2 3 1 08:02:04
3 1 1 08:02:20
3 2 5 08:02:24
3 1 1 08:02:30
3 2 1 08:02:35

我想检查每张收据是否存在单元 5。如果第 5 单元存在,我只想 select 个有预订时间的职位,然后输入第 5 个单元。

对于上面的例子,我的结果应该是这样的:

收据 位置 单位 预订时间
1 1 1 08:00:30
1 2 1 08:00:33
1 3 1 08:00:37
1 4 1 08:00:40
1 5 1 08:00:49
2 1 1 08:01:55
2 2 1 08:01:58
2 3 1 08:02:04
3 1 1 08:02:30
3 2 1 08:02:35

我有一个开始,如果只有一张收据,它会提供正确的结果:

Select * from test
where bookingtime> (case
                when (select Max(bookingtime) from test where unit=5) is null
                then (Select convert(time,'00:00:00'))
                Else (select Max(bookingtime) from testdb where unit=5)
                End)

让此代码 运行 分别通过每张收据以便获得我正在寻找的结果,我错过了什么?

您可以使用 window 函数获取第 5 单元的时间:

select t.*
from (select t.*,
             min(case when unit = 5 then bookingtime end) over (partition by receipt) as bookingtime_5
      from t
     ) t
where bookingtime_5 is null or
      bookingtime > bookingtime_5;