情况...对于子组
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;
我有 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;