2011-08-18 36 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