Sql 需要基于计数的输出或基于时差的权重
我有表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 所需输出为: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
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