我的表:Trnevents
# > g++ -o test foo.cpp bar.cpp badlad.cpp
./test
BadLad, reset count to, 1
BadLad, 2
BadLad, 3
~BadLad, 2
Segmentation fault
我使用这个查询它运作良好,但它的时间相同
emp_reader_id EVENTID DT
102 0 2018-01-04 15:57:04.000
102 0 2018-01-04 15:58:05.000
102 1 2018-01-04 16:46:19.000
102 0 2018-01-04 18:15:27.000
102 1 2018-01-04 18:20:47.000
102 0 2018-01-04 20:02:05.000
102 0 2018-01-04 21:47:29.000
102 1 2018-01-04 22:00:00.000
结果:
select
emp_Reader_id, cast(DT as date) [date]
, DT as check_in_1
, next_timestamp as check_out_1
from (
select
emp_Reader_id, DT, EVENTID, next_timestamp, next_EVENTID
, dense_rank() over(partition by emp_Reader_id, cast(DT as date) order by DT) in_rank
from trnevents t1
outer apply (
select top(1) t2.DT, t2.EVENTID
from trnevents t2
where t1.emp_Reader_id = t2.emp_Reader_id and t1.EVENTID <> t2.EVENTID
and cast(t1.DT as date) = cast(t2.DT as date)
and t1.DT < t2.DT
order by t2.DT
) oa (next_timestamp, next_EVENTID)
where EVENTID = '0'
) d
group by emp_Reader_id, cast(DT as date),DT,next_timestamp
order by emp_reader_id
预期产出:
emp_Reader_id date check_in_1 check_out_1
102 2018-01-04 2018-01-04 15:57:04.000 2018-01-04 16:46:19.000
102 2018-01-04 2018-01-04 15:58:05.000 2018-01-04 16:46:19.000
102 2018-01-04 2018-01-04 18:15:27.000 2018-01-04 18:20:47.000
102 2018-01-04 2018-01-04 20:02:05.000 2018-01-04 22:00:00.000
102 2018-01-04 2018-01-04 21:47:29.000 2018-01-04 22:00:00.000
是否有可能超过预期的输出。任何人都可以提供帮助。 提前致谢
答案 0 :(得分:5)
此查询适用于SQL 2012或更高版本
示例数据
create table Trnevents (
emp_reader_id int
, EVENTID int
, DT datetime
)
insert into Trnevents
select
a, b, cast(c as datetime)
from
(values
(102, 0, '20180104 15:57:04')
,(102, 0, '20180104 15:58:05')
,(102, 1, '20180104 16:46:19')
,(102, 0, '20180104 18:15:27')
,(102, 1, '20180104 18:20:47')
,(102, 0, '20180104 20:02:05')
,(102, 0, '20180104 21:47:29')
,(102, 1, '20180104 22:00:00')
) t (a, b, c)
查询:
select
emp_reader_id, cast(max(DT) as date), max(iif(EVENTID = 0, DT, null)), max(iif(EVENTID = 1, DT, null))
from (
select
*, grp = sum(iif(EVENTID = 0, 1, 0) ) over (partition by emp_reader_id order by DT)
from
Trnevents
) t
group by emp_reader_id, grp
答案 1 :(得分:4)
您可以使用LEAD
功能探测下一行:
WITH cte AS (
SELECT *, CASE WHEN eventid = 0 THEN
LEAD(CASE WHEN eventid = 1 THEN dt ELSE NULL END, 1)
OVER (PARTITION BY emp_reader_id ORDER BY dt)
END AS checkout_time
FROM testdata
)
SELECT *
FROM cte
WHERE eventid = 0
结果:
| emp_reader_id | eventid | dt | checkout_time |
|---------------|---------|---------------------|---------------------|
| 102 | 0 | 2018-01-04 15:57:04 | NULL |
| 102 | 0 | 2018-01-04 15:58:05 | 2018-01-04 16:46:19 |
| 102 | 0 | 2018-01-04 18:15:27 | 2018-01-04 18:20:47 |
| 102 | 0 | 2018-01-04 20:02:05 | NULL |
| 102 | 0 | 2018-01-04 21:47:29 | 2018-01-04 22:00:00 |
答案 2 :(得分:3)
试试这个:
select * from (
select *,
case when Lead(eventid) over (order by dt) = 1
then Lead(dt) over (order by dt) end [CloseTime]
from Trnevents
) a where EVENTID = 0
注意:它重新查询SQL Server 2012或更新版本。