2013-06-21 61 views
0

我需要從表中提取數據集的開始和結束點。對於防爆如果數據是這樣的:獲取SQL Server 2008中數據集的開始和結束

1 
5 
10 
15 
20 

40 
45 
50 
55 
60 
65 
70 

現在2個數據集1 - 20和40 - 70所以數據將始終是連續的,並在一個單一的數據集將最大點之間的差是7。所以結果查詢應該給我3列:

1. 5 15 
2. 45 65 

即數據集中的第二個和第二個最後一個點。

是否可以不使用forloop的遊標。如果可以,請發佈查詢。 我試過的是使用overpartition by,但沒有運氣

回答

1

如果我理解你的話,這會返回你所要求的。

DECLARE @tmp TABLE 
    (
     numVal INT PRIMARY KEY 
    ); 

INSERT @tmp 
VALUES 
    (1) 
    ,(5) 
    ,(10) 
    ,(15) 
    ,(20) 
    ,(40) 
    ,(45) 
    ,(50) 
    ,(55) 
    ,(60) 
    ,(65) 
    ,(70); 

;WITH breaks AS 
    (
     SELECT 
      t.numval breakMax 
      , ROW_NUMBER() 
       OVER(
        ORDER BY t.numval 
        ) breakGroup 
     FROM 
      @tmp t 
     WHERE 
      NOT EXISTS 
       (
        SELECT 
         NULL 
        FROM 
         @tmp t1 
        WHERE 
         t1.numVal > t.numVal 
         AND 
         t1.numVal <= t.numVal + 7 
       ) 
    ) 
SELECT 
    v.breakGroup 
    , MIN(v.numval) secondNum 
    , MAX(v.numVal) secondLastNum 
FROM 
    ( 
     SELECT 
      t.numVal 
      , br.breakGroup 
      , ROW_NUMBER() 
       OVER(
        PARTITION BY 
         br.breakGroup 
        ORDER BY 
         t.numval 
        ) ar 
      , ROW_NUMBER() 
       OVER(
        PARTITION BY 
         br.breakGroup 
        ORDER BY 
         t.numval DESC 
        ) dr 
     FROM  
      @tmp t 
     CROSS APPLY 
      (
       SELECT 
        TOP 1 
        breakGroup 
       FROM 
        breaks b 
       WHERE  
        b.breakMax >= t.numVal 
       ORDER BY 
        b.breakGroup 
      ) br 
    ) v 
WHERE 
    v.ar = 2 
    OR 
    v.dr = 2 
GROUP BY 
    v.breakGroup 
+0

添加了更多我的問題。謝謝你的回答,偉大的幫助 – batman

+0

不要擔心它,正在犯一個愚蠢的錯誤。所有好夥伴。萬分感謝。 – batman

相關問題