2011-08-18 25 views
0
TID StartTime     Uid WId 
1  2011-06-06 09:30:00.000  10 1.5 
2  2011-06-06 09:40:00.000  10 3.5 
3  2011-06-06 09:50:00.000  10 1.0 
4  2011-06-06 10:45:00.000  10 2.5 
5  2011-06-06 10:50:00.000  10 1.5 
6  2011-06-06 10:55:00.000  10 0 
7  2011-06-06 11:30:00.000  10 0 
8  2011-06-06 11:35:00.000  10 0 
9  2011-06-06 11:40:00.000  10 0 
10 2011-06-06 11:43:00.000  10 0 
11 2011-06-06 11:20:00.000  11 7.0 
12 2011-06-06 11:30:00.000  11 1.0 

我有表TblTask​​數據基於計數或權重需要的輸出,我需要編寫一個查詢來計算(SUM(WID)或Count(TID的))基於每個開始時間的時間差另一個啓動時間的時差爲1小時或接近1小時由UID分組。基於爲TimeDifference

例如先取時間(2011-06-06 09:30:00); < = 1小時的最近開始時間爲(2011-06-06 10:30:00.000)(如果SUM(Wid)> = 5.0或行數≥5)。這裏的權重是(1.5 + 3.5 + 1.0 = 6.0) TID的(3,4,5)Here Weights是(1.0),我們需要顯示記錄和 前3行TID(1,2,3) + 2.5 + 1.5 = 5.0) 對於TID'd(4,5,6,7,8,9,10)這裏計數(TID是7)所以我想顯示所有記錄從4到10

TID的(5,6,7,8,9,10)爲Count(TID's> 5)我想顯示從5到10的所有記錄

對於TID(6,7,8,9,10)as計數(TID是= 5)我想顯示從6到10的所有記錄

對於TID 11,因爲WID> 5我想顯示記錄11

對於TID的(11,12)爲WID> 5,我再次想顯示記錄11和12

所需的輸出將是:

TID StartTime     Uid 
1  2011-06-06 09:30:00.000 10  
2  2011-06-06 09:40:00.000 10  
3  2011-06-06 09:50:00.000 10 
3  2011-06-06 09:50:00.000 10  
4  2011-06-06 10:45:00.000 10  
5  2011-06-06 10:50:00.000 10  
4  2011-06-06 10:45:00.000 10  
5  2011-06-06 10:50:00.000 10  
6  2011-06-06 10:55:00.000 10  
7  2011-06-06 11:30:00.000 10  
8  2011-06-06 11:35:00.000 10  
9  2011-06-06 11:40:00.000 10  
10 2011-06-06 11:43:00.000 10  
5  2011-06-06 10:50:00.000 10  
6  2011-06-06 10:55:00.000 10  
7  2011-06-06 11:30:00.000 10  
8  2011-06-06 11:35:00.000 10  
9  2011-06-06 11:40:00.000 10  
10 2011-06-06 11:43:00.000 10  
6  2011-06-06 10:55:00.000 10  
7  2011-06-06 11:30:00.000 10  
8  2011-06-06 11:35:00.000 10  
9  2011-06-06 11:40:00.000 10  
10 2011-06-06 11:43:00.000 10  
11 2011-06-06 11:20:00.000 11 
11 2011-06-06 11:20:00.000 11  
12 2011-06-06 11:30:00.000 11 
+0

你能再試一次重申你的算法?如果他們是連續的,你想要每小時的樂隊,但總是在一小時後將樂隊的開始時間重置到下一個起點? – billinkc

回答

0

備選方案I:不會趕上孤行11,因爲它會嘗試從每個起點選擇最長的有效序列。

SELECT C.* 
FROM (
    SELECT 
     A.UID, 
     A.TID AS TID1, 
     MAX(B.TID) AS TID2 
    FROM TblTask A 
    INNER JOIN TblTask B 
     ON B.UID = A.UID 
     AND B.StartTime BETWEEN A.StartTime AND DATEADD(hour, 1, A.StartTime) 
    GROUP BY A.TID, A.UID 
    HAVING SUM(B.WId) >= 5 OR COUNT(*) >= 5 
) Ranges 
INNER JOIN TblTask C 
    ON C.UID = Ranges.UID 
    AND C.TID BETWEEN Ranges.TID1 AND Ranges.TID2 

替代二:將報告,因爲這些秋天的標準中都(4..9)和(4..10)。

SELECT D.* 
FROM (
    SELECT 
     A.Uid, 
     A.TID AS TID1, 
     B.TID AS TID2 
    FROM TblTask A 
    INNER JOIN TblTask B 
     ON B.Uid = A.Uid 
     AND B.StartTime BETWEEN A.StartTime AND DATEADD(hour, 1, A.StartTime) 
    INNER JOIN TblTask C 
     ON C.UID = A.UID 
     AND C.TID BETWEEN A.TID AND B.TID 
    GROUP BY A.TID, B.TID, A.Uid 
    HAVING SUM(C.WId) >= 5 OR COUNT(*) >= 5 
) Ranges 
INNER JOIN TblTask D 
    ON D.Uid = Ranges.Uid 
    AND D.TID BETWEEN Ranges.TID1 AND Ranges.TID2; 

無論哪種方式,您都可以添加Ranges表中的列以區分連接的子序列。

替代我的結果:

TID StartTime     Uid WId 
    1 2011-06-06 09:30:00.000 10 1.5 
    2 2011-06-06 09:40:00.000 10 3.5 
    3 2011-06-06 09:50:00.000 10 1.0 
    3 2011-06-06 09:50:00.000 10 1.0 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
11 2011-06-06 11:20:00.000 11 7.0 
12 2011-06-06 11:30:00.000 11 1.0 

替代II的結果:

TID StartTime     Uid WId 
    1 2011-06-06 09:30:00.000 10 1.5 
    2 2011-06-06 09:40:00.000 10 3.5 
    1 2011-06-06 09:30:00.000 10 1.5 
    2 2011-06-06 09:40:00.000 10 3.5 
    3 2011-06-06 09:50:00.000 10 1.0 
    3 2011-06-06 09:50:00.000 10 1.0 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
    4 2011-06-06 10:45:00.000 10 2.5 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
    5 2011-06-06 10:50:00.000 10 1.5 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
    6 2011-06-06 10:55:00.000 10 0.0 
    7 2011-06-06 11:30:00.000 10 0.0 
    8 2011-06-06 11:35:00.000 10 0.0 
    9 2011-06-06 11:40:00.000 10 0.0 
10 2011-06-06 11:43:00.000 10 0.0 
11 2011-06-06 11:20:00.000 11 7.0 
11 2011-06-06 11:20:00.000 11 7.0 
12 2011-06-06 11:30:00.000 11 1.0