Sql 需要基于计数的输出或基于时差的权重

Sql 需要基于计数的输出或基于时差的权重,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,我有表TblTask中的数据,我需要编写一个查询,根据每个开始时间的时差计算(求和(Wid)或计数(TID)),另一个开始时间的时差为1小时或接近1小时,按UID分组 例如,以第一次启动时间(2011-06-06 09:30:00.000)为例;最近的开始时间=5.0或行数>=5)。这里的权重是(1.5+3.5+1.0=6.0) 前3行TID(1,2,3)作为重量>=5,我们需要显示记录和 TID(3,4,5)此处的权重为(1.0+2.5+1.5=5.0) 对于TID(4,5,6,7,8,9,1

我有表TblTask中的数据,我需要编写一个查询,根据每个开始时间的时差计算(求和(Wid)或计数(TID)),另一个开始时间的时差为1小时或接近1小时,按UID分组

例如,以第一次启动时间(2011-06-06 09:30:00.000)为例;最近的开始时间=5.0或行数>=5)。这里的权重是(1.5+3.5+1.0=6.0) 前3行TID(1,2,3)作为重量>=5,我们需要显示记录和 TID(3,4,5)此处的权重为(1.0+2.5+1.5=5.0) 对于TID(4,5,6,7,8,9,10),这里计数(TID是7),所以我想显示从4到10的所有记录

对于TID(5,6,7,8,9,10)作为计数(TID大于5),我希望显示从5到10的所有记录

对于TID(6,7,8,9,10)作为计数(TID=5),我希望显示6到10之间的所有记录

对于TID 11 WID>5,我想显示记录11

对于WID>5的TID(11,12),我想再次显示记录11和12

所需输出为:

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

备选方案I:不会捕获单独的第11行,因为它将尝试从每个起点选取最长的有效序列

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   
备选方案二:将同时报告(4..9)和(4..10),因为它们属于标准范围

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
在这两种选择中,您都可以从
范围
表中添加列,以区分串联的子序列

备选方案一的结果:

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;
备选案文二的结果:

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

你能再次尝试重新启动你的算法吗?如果是连续的,但总是在一个小时后将一个波段的开始时间重置为下一个开始点,则需要每小时波段?
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