【问题标题】:Need output Based on Count OR Weights based on TimeDifference需要基于计数的输出或基于 TimeDifference 的权重
【发布时间】:2011-08-18 15:26:54
【问题描述】:
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

我有 Table TblTask​​ 中的数据,我需要编写一个查询来计算 (sum(Wid) 或 Count(TID's)) 基于每个 Starttime 的时差与另一个时差为 1 小时或接近 1 小时的 starttime按 UID 分组。

例如取第一次开始时间(2011-06-06 09:30:00.000); =5.0 或行数 >=5)。这里的权重是 (1.5+3.5+1.0=6.0) 前 3 行 TID (1,2,3) 作为 weight>=5 我们需要显示记录和 TID 的 (3,4,5) 这里的权重是 (1.0+2.5+1.5=5.0) For TID'd(4,5,6,7,8,9,10) Here Count (TID's is 7) 所以我想显示从 4 到 10 的所有记录

对于 TID's(5,6,7,8,9,10) 作为计数(TID's > 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  
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   

【问题讨论】:

  • 你能不能再试试重述你的算法?如果它们是连续的,但总是在一个小时后将带的开始时间重置到下一个起点,您想要每小时带吗?

标签: sql sql-server sql-server-2005 tsql sql-server-2008


【解决方案1】:

备选方案 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

备选方案 II:将报告 (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

备选方案二的结果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2014-02-04
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多