我需要编写查询脚本以丢弃不超过预定余量的访问日志(例如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
提前致谢!
答案 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
添加更多数据,则会失败,这会添加另一组数据,这些数据应在前一个有效和无效数据间隔后被拒绝。
我更喜欢第一种变体。为什么要存储数据并在之后处理它,如果你能够更早,更容易地得到你想要的东西?!