日期:2014-05-18  浏览次数:20476 次

向大家请教应用中一个比较复杂的搜索
朋友们请教一个查询,谢谢,数据示例:

列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也无任何数据被查出。

不知道我这样解释清楚吗,望论坛里朋友帮个忙,麻烦大家了

------解决方案--------------------
修正并增加数据测试,搂主自己测试下是否还有问题

SQL code
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 NUM
FROM @T
)
SELECT 
B.[列1],SUM(B.列2) AS [列2],MIN(B.列3) AS [列3]
FROM CTE A,CTE B
WHERE A.[列1] = B.[列1]
AND A.[列4] = 'D'
AND B.[列4] = 'D'
AND A.NUM <= B.NUM
AND 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.NUM
HAVING SUM(B.列2) >= 40

--结果
列1    列2    列3
a    50    15:58:00
a    45    15:59:31
b    50    15:59:29
C    50    15:59:34