SQL - 如果在过去一小时内插入了新的唯一记录,则发出警报

Dmi*_*ryK 5 sql sql-server-2005

我试图找到一个优雅的解决方案,以SQL查询的形式解决以下问题.

新记录将插入Log表中.我需要检测我之前没见过的任何新记录(插入在最后一小时内)并生成警报(例如,这些记录的数量> 0)

ID, Url, DOB
1, site1.com/page1, "5/06/2012 20:01"
2, site2.com/page2, "5/06/2012 21:20"
3, site1.com/page1, "6/06/2012 10:05"
Run Code Online (Sandbox Code Playgroud)

如果"now"是6/06/2012 10:40 - 我看到插入了1条新记录(id = 3),但我不想生成警报,因为我们之前已经看过这个URL(id = 1) .

如果我们有4,site3.com/pageX,"6/06/2012 10:08"那么我想生成一个警报(返回计数= 1),因为这一行是在最后一小时插入的,我们还没有看到它之前.

实施它的最佳方法是什么?理想情况下没有嵌套查询

Gar*_*thD 5

我想这就是你所追求的.这将在最后一小时检索新条目(其中new表示最后一小时没有访问过相同的URL)

SELECT  *
FROM    Log
WHERE   DOB > DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
AND     NOT EXISTS
        (   SELECT  1
            FROM    Log T1
            WHERE   T1.URL = Log.URL 
            AND     T1.DOB < DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
        )
Run Code Online (Sandbox Code Playgroud)

关于SQL Fiddle的工作示例

编辑

刚看到你只需要计数的评论:

SELECT  COUNT(*)
FROM    Log
WHERE   DOB > DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
AND     NOT EXISTS
        (   SELECT  1
            FROM    Log T1
            WHERE   T1.URL = Log.URL 
            AND     T1.DOB < DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
        )
Run Code Online (Sandbox Code Playgroud)

编辑2

我不确定为什么只需要一个选择,但是,最接近一个选择的是:

SELECT  COUNT(*)
FROM    (   SELECT  *, MIN(DOB) OVER(PARTITION BY URL) [FirstViewed]
            FROM    Log
        ) Log
WHERE   FirstViewed >= DATEADD(HOUR, -1, CURRENT_TIMESTAMP)
Run Code Online (Sandbox Code Playgroud)

如果在过去一小时内访问过两次同一页面,则仍会返回2.

http://sqlfiddle.com/#!3/5a8bc/1