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),因为这一行是在最后一小时插入的,我们还没有看到它之前.
实施它的最佳方法是什么?理想情况下没有嵌套查询
我想这就是你所追求的.这将在最后一小时检索新条目(其中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
| 归档时间: |
|
| 查看次数: |
1586 次 |
| 最近记录: |