2015-11-04 93 views
0

我需要爲連續3天有事件(訪問建築物)的每位員工取得第二條記錄,並且僅爲每位員工提供最舊的結果。sql-server-2005根據日期查詢連續3天的第二條記錄

時間沒有考慮到。

我的表是這樣的:

EMPID EVENTIME 
4 2015-08-05 13:34:54.000 
4 2015-08-19 16:29:32.000 
4 2015-08-21 16:30:35.000 
4 2015-08-24 13:51:25.000 
4 2015-08-24 16:32:39.000 
4 2015-08-26 13:48:32.000 
4 2015-08-26 16:29:58.000 
4 2015-08-27 16:30:07.000 
4 2015-08-28 14:00:02.000 
4 2015-08-28 16:29:09.000 
19 2015-08-10 07:27:10.000 
19 2015-08-10 15:18:51.000 
19 2015-08-11 07:33:12.000 
19 2015-08-11 07:33:16.000 
19 2015-08-11 10:19:56.000 
19 2015-08-11 15:49:12.000 
19 2015-08-12 07:21:06.000 
19 2015-08-12 10:37:53.000 
19 2015-08-12 12:48:12.000 
19 2015-08-12 14:11:25.000 
19 2015-08-12 15:01:18.000 
19 2015-08-13 07:25:38.000 
21 2015-08-03 10:07:00.000 
21 2015-08-10 08:00:41.000 

和期望的結果是這樣的:

EMPID EVENTIME 
4 2015-08-27 //first record that had an event 1 day before and 1 day after 
19 2015-08-11 //first record that had an event 1 day before and 1 day after 

由於訪問是由感應卡控制,這些都是測試,然後幾天之後交付給新員工,那麼第一筆記錄將不起作用,並且這些連續三天的第一筆記錄也不會起作用,因爲卡片是在早上從下午開始丟失的事件。這就是爲什麼我需要查詢連續前3天的第二條記錄。

這會給我一個我可以用於報告的每個員工的開始日期。

我正在使用mssql 2005.

謝謝!

回答

0

掙扎幾個小時後,我終於做到了。如果有人需要它:

WITH RESULTS AS(
    SELECT EVENTS.EMPID, CAST(DATEDIFF(d,0,EVENTS.EVENTIME) AS DATETIME) AS EVENTIME, COUNT(CAST(DATEDIFF(d,0,EVENTS.EVENTIME) AS DATETIME)) AS THIS_DAY 
    FROM EVENTS INNER JOIN EMP ON EVENTS.EMPID = EMP.ID 
    WHERE (EVENTIME > '2015-08-01') 
    GROUP BY EVENTS.EMPID, CAST(DATEDIFF(d,0,EVENTS.EVENTIME) AS DATETIME) 
) 
SELECT A.EMPID, MIN(A.EVENTIME) AS EVENTIME 
FROM RESULTS A 
    INNER JOIN RESULTS B ON A.EMPID = B.EMPID 
    AND CAST(DATEDIFF(d,0,B.EVENTIME) AS DATETIME) = CAST(DATEDIFF(d,0,DATEADD(d,-1,A.EVENTIME)) AS DATETIME) 
    INNER JOIN RESULTS C ON B.EMPID = C.EMPID 
    AND CAST(DATEDIFF(d,0,C.EVENTIME) AS DATETIME) = CAST(DATEDIFF(d,0,DATEADD(d,1,A.EVENTIME)) AS DATETIME) 
GROUP BY A.EMPID 
ORDER BY A.EMPID