带有DateDIFF的复杂SQL QUERY

时间:2013-02-25 11:50:29

标签: tsql datediff

我需要编写查询脚本以丢弃不超过预定余量的访问日志(例如2秒)。也就是说,如果每个记录是由用户在特定日期/时间制作的,我不希望得到那些日期/时间不超过上一记录的日期/时间范围的人。我认为一个例子更清楚。

示例:

LogIndex, UserID, Date / Time

1. 01551, 20.02.2013 17:41:45.000
2. 01551, 20.02.2013 17:41:45.900 *
3. 01551, 20.02.2013 17:41:46.150 *
4. 01551, 20.02.2013 20:41:47.000

5. 01552, 02/20/2013 17:42:45.000
6. 01552, 20.02.2013 17:42:46.000 *
7. 01552, 02/20/2013 19:45:45.000 *

要丢弃的记录,因为其日期/时间不超过前一记录的2秒。在第一种情况下,应该放弃两个记录,因为两个记录都不超过这个余量。

这是创建临时表的代码,并将以前的记录添加到test:

CREATE TABLE # TEMP (LogIndex int, UserID nvarchar (10), LogTime datetime)

insert into # temp select 1, '01551 ', '20 / 02/2013 17:41:45.000'
insert into # temp select 2, '01551 ', '20 / 02/2013 17:41:45.900'
insert into # temp select 3, '01551 ', '20 / 02/2013 17:41:46.150'
insert into # temp select 4, '01551 ', '20 / 02/2013 20:41:47.000'
insert into # temp select 5, '01552 ', '20 / 02/2013 17:42:45.000'
insert into # temp select 6, '01552 ', '20 / 02/2013 17:42:46.000'
insert into # temp select 7, '01552 ', '20 / 02/2013 19:45:45.000'

select * from # temp

DROP TABLE # temp

提前致谢!

1 个答案:

答案 0 :(得分:0)

你是否考虑过反过来解决这个问题?

你可以在表上创建一个INSERT - 触发器,它存储访问日志并拒绝与前一个时间差小于你定义的数据。根据{{​​1}}保存最后一个数据应该更容易,并将其与当前数据进行比较,而不是编写一个在收集数据后解决您的任务的查询。

您还可以通过userID将这些日志保存在单独的表中 - 触发器(我相信这些数据来自访问控制,因此您不能删除这些记录,不是吗?)

尽管如此,如果您希望事后通过查询来实现目标,请尝试以下方法:

INSERT

请注意,此查询只是一个提示。它适用于您的演示数据,但如果您按WITH "CTE" AS ( SELECT T1.* , diff = DATEDIFF( MS, T2.LogTime, T1.LogTime ) FROM #TEMP AS T1 LEFT JOIN #TEMP AS T2 ON 1 = 1 AND T1.LogIndex = T2.LogIndex + 1 AND T1.UserID = T2.UserID ) , "ROLSUM" AS ( SELECT * , sumDiff = ( SELECT SUM(diff) FROM "CTE" AS C2 WHERE C2.LogIndex <= C1.LogIndex AND C2.UserId = C1.UserId ) FROM "CTE" AS C1 ) SELECT LogIndex, UserID, LogTime FROM ROLSUM WHERE sumDiff > 2000 OR sumDiff IS NULL 添加更多数据,则会失败,这会添加另一组数据,这些数据应在前一个有效和无效数据间隔后被拒绝。

我更喜欢第一种变体。为什么要存储数据并在之后处理它,如果你能够更早,更容易地得到你想要的东西?!