如何Select第一次进入,然后只能间隔大于5分钟的次数
How to Select the first time entry, then only times greater than 5 minutes apart
CREATE TABLE import_time
( date datetime NUll,
time datetime Null,
Employeeid nvarchar(25) Null)
INSERT INTO import_time (date, time, Employeeid)
Values ('2019-05-22 00:00:00.000', '1900-01-01 12:50:12.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 12:55:00.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 13:25:12.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 13:50:12.000', '1234')
如何只select第一次进入然后相隔大于5分钟的时间?
查询应该 return 12:50、13:25 和 13:50 而不是 12:55 条目
您可以使用 NOT EXISTS
检查当前时间过去五分钟内是否没有其他行的时间小于或等于我们使用 dateadd()
获得的时间。
要确定某行是否不是当前行,您需要一个键。由于您的 post 中没有,我使用未记录的 %%physloc%%
伪列作为替代项。但未记录意味着如有更改,恕不另行通知,因此您想替换它。
要修复拆分日期时间,您可以使用 +
。
为了方便起见,我使用 CTE 将原始 table 准备成更有用的形式。
WITH
cte
AS
(
SELECT date,
time,
employeeid,
date + time datetime,
%%physloc%% physloc
FROM import_time
)
SELECT c1.date,
c1.time,
c1.employeeid
FROM cte c1
WHERE NOT EXISTS (SELECT *
FROM cte c2
WHERE c2.employeeid = c1.employeeid
AND c2.physloc <> c1.physloc
AND c2.datetime <= c1.datetime
AND c2.datetime > dateadd(minute, -5, c1.datetime));
试试这个-
DECLARE @import_time TABLE
(
date datetime NUll,
time datetime Null,
Employeeid nvarchar(25) Null
)
INSERT INTO @import_time (date, time, Employeeid)
Values
('2019-05-22 00:00:00.000', '1900-01-01 12:50:12.000', '1234') ,
('2019-05-22 00:00:00.000', '1900-01-01 12:55:00.000', '1234') ,
('2019-05-22 00:00:00.000', '1900-01-01 13:25:12.000', '1234'),
('2019-05-22 00:00:00.000', '1900-01-01 13:50:12.000', '1234')
SELECT
CONVERT(VARCHAR(5),B.time ,108)
FROM
(
SELECT Employeeid,MIN ([time]) EnrtyTime
FROM @import_time
GROUP BY Employeeid
) A
INNER JOIN @import_time B
ON A.Employeeid = B.Employeeid
AND
(
A.EnrtyTime = B.time
OR
B.time >= DATEADD(MINUTE,5,A.EnrtyTime)
)
首先将上一行的日期和时间添加到每一行。
您可以使用 LED 来做到这一点。希望您拥有 SQL Server 2012 及更高版本
你也应该注意午夜前后的时间,因为对于那些条目,如果你只比较时间,你可能会出错。
;with ct as (
select [date], [time], Employeeid
, prev_date = lag([date]) over (partition by Employeeid order by [date], [time])
, prev_time = lag([time]) over (partition by Employeeid order by [date], [time])
from #time
)
select [date], [time], Employeeid
from ct
where prev_date is null or prev_time is null -- this gives you the first entry
or datediff(minute, prev_date + prev_time, date + time) > 5
结果:
CREATE TABLE import_time
( date datetime NUll,
time datetime Null,
Employeeid nvarchar(25) Null)
INSERT INTO import_time (date, time, Employeeid)
Values ('2019-05-22 00:00:00.000', '1900-01-01 12:50:12.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 12:55:00.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 13:25:12.000', '1234')
, ('2019-05-22 00:00:00.000', '1900-01-01 13:50:12.000', '1234')
如何只select第一次进入然后相隔大于5分钟的时间? 查询应该 return 12:50、13:25 和 13:50 而不是 12:55 条目
您可以使用 NOT EXISTS
检查当前时间过去五分钟内是否没有其他行的时间小于或等于我们使用 dateadd()
获得的时间。
要确定某行是否不是当前行,您需要一个键。由于您的 post 中没有,我使用未记录的 %%physloc%%
伪列作为替代项。但未记录意味着如有更改,恕不另行通知,因此您想替换它。
要修复拆分日期时间,您可以使用 +
。
为了方便起见,我使用 CTE 将原始 table 准备成更有用的形式。
WITH
cte
AS
(
SELECT date,
time,
employeeid,
date + time datetime,
%%physloc%% physloc
FROM import_time
)
SELECT c1.date,
c1.time,
c1.employeeid
FROM cte c1
WHERE NOT EXISTS (SELECT *
FROM cte c2
WHERE c2.employeeid = c1.employeeid
AND c2.physloc <> c1.physloc
AND c2.datetime <= c1.datetime
AND c2.datetime > dateadd(minute, -5, c1.datetime));
试试这个-
DECLARE @import_time TABLE
(
date datetime NUll,
time datetime Null,
Employeeid nvarchar(25) Null
)
INSERT INTO @import_time (date, time, Employeeid)
Values
('2019-05-22 00:00:00.000', '1900-01-01 12:50:12.000', '1234') ,
('2019-05-22 00:00:00.000', '1900-01-01 12:55:00.000', '1234') ,
('2019-05-22 00:00:00.000', '1900-01-01 13:25:12.000', '1234'),
('2019-05-22 00:00:00.000', '1900-01-01 13:50:12.000', '1234')
SELECT
CONVERT(VARCHAR(5),B.time ,108)
FROM
(
SELECT Employeeid,MIN ([time]) EnrtyTime
FROM @import_time
GROUP BY Employeeid
) A
INNER JOIN @import_time B
ON A.Employeeid = B.Employeeid
AND
(
A.EnrtyTime = B.time
OR
B.time >= DATEADD(MINUTE,5,A.EnrtyTime)
)
首先将上一行的日期和时间添加到每一行。 您可以使用 LED 来做到这一点。希望您拥有 SQL Server 2012 及更高版本
你也应该注意午夜前后的时间,因为对于那些条目,如果你只比较时间,你可能会出错。
;with ct as (
select [date], [time], Employeeid
, prev_date = lag([date]) over (partition by Employeeid order by [date], [time])
, prev_time = lag([time]) over (partition by Employeeid order by [date], [time])
from #time
)
select [date], [time], Employeeid
from ct
where prev_date is null or prev_time is null -- this gives you the first entry
or datediff(minute, prev_date + prev_time, date + time) > 5
结果: