向大家请教应用中一个比较复杂的搜索
朋友们请教一个查询,谢谢,数据示例:
列1 列2 列3 列4
a 10 15:59:30 N
a 20 15:59:29 D
b 20 15:59:29 D
a 10 15:59:29 D
b 15 15:59:20 N
c 25 15:58:30 D
b 10 15:58:30 N
c 10 15:58:30 D
a 20 15:58:00 D
b 5 15:57:50 D
列3是时间列,时刻都有名字为列1的数据进来
我现在就想查询,根据指定连续多少个列2的值的范围,和列4的字母,来查询出,每个(a,b,c...)相同列4连续时间段中,列2的值。
比如说我想查询,连续列1中,所有连续列4为‘D’,并且列2和值大于40的数据,就应该输出
因为指定了要查询连续时间记录为D的。所以
第二行,第四行,第九行。 是a连续时间段内,并且列4为D的数据行。并且这几行列2的和值为50,符合条件,时间列3输出最小的那个时间。
列1 列2 列3
a 50 15:58:00
b因为第三行为D,第五行为N,第七行为N,第十行为D,D并没有连续时间段的数据所以无数据(但如果指定的是查询连续N的记录,第五行和第七行就会被查出来。并计算列2的和值)
c第六行,第八行为D,且在自己的连续记录上,但是这两行数据列2的值和仅为35,并不满足一开始条件指定的大于40。所以C也无任何数据被查出。
不知道我这样解释清楚吗,望论坛里朋友帮个忙,麻烦大家了
[解决办法]
修正并增加数据测试,搂主自己测试下是否还有问题
DECLARE @T TABLE(列1 VARCHAR(10),列2 INT,列3 VARCHAR(10),列4 VARCHAR(10))INSERT @T SELECT'a', 10, '15:59:30', 'N'UNION ALL SELECT'a', 20, '15:59:29', 'D' UNION ALL SELECT'b', 20, '15:59:29', 'D'UNION ALL SELECT'a', 10, '15:59:29', 'D'UNION ALL SELECT'b', 15, '15:59:20', 'N'UNION ALL SELECT'c', 25, '15:58:30', 'D'UNION ALL SELECT'b', 10, '15:58:30', 'N'UNION ALL SELECT'c', 10, '15:58:30', 'D'UNION ALL SELECT'a', 20, '15:58:00', 'D'UNION ALL SELECT'b', 5, '15:57:50', 'D'--添加数据INSERT @T SELECT'a', 10, '15:59:31', 'D'UNION ALL SELECT'a', 20, '15:59:32', 'D' UNION ALL SELECT'a', 15, '15:59:33', 'D' UNION ALL SELECT'C', 15, '15:59:33', 'N' UNION ALL SELECT'C', 50, '15:59:34', 'D' UNION ALL SELECT'B', 30, '15:59:34', 'D' ;WITH CTE AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY [列1] ORDER BY [列3]) AS NUMFROM @T)SELECT B.[列1],SUM(B.列2) AS [列2],MIN(B.列3) AS [列3]FROM CTE A,CTE BWHERE A.[列1] = B.[列1]AND A.[列4] = 'D'AND B.[列4] = 'D'AND A.NUM <= B.NUMAND NOT EXISTS ( SELECT 1 FROM CTE WHERE [列1] = A.[列1] AND NUM > A.NUM AND NUM < B.NUM AND [列4] <> 'D' )AND NOT EXISTS ( SELECT 1 FROM CTE WHERE [列1] = A.[列1] AND NUM = A.NUM - 1 AND [列4] = 'D' )GROUP BY B.[列1],A.NUMHAVING SUM(B.列2) >= 40--结果列1 列2 列3a 50 15:58:00a 45 15:59:31b 50 15:59:29C 50 15:59:34