1
SELECT MIN(col1) AS start_range, MAX(col1) AS end_range 
FROM (SELECT col1, 
        (
        SELECT MIN(B.col1) 
         FROM dbo.T1 AS B 
         WHERE B.col1 >= A.col1 
           AND NOT EXISTS 
             (SELECT * 
              FROM dbo.T1 AS C 
              WHERE C.col1 = B.col1 + 1)
        ) AS grp
      FROM dbo.T1 AS A) AS jh 
GROUP BY grp;

「AS jh」を削除するとエラーになるのはなぜですか? なぜ同じ「AS grp」が必要なのか。(グループ化しているので同じではありません)が、削除できません。2 番目のコードでは、そのような「AS」はありません。

SELECT col1, 
  (SELECT MIN(B.col1) 
    FROM dbo.T1 AS B 
    WHERE B.col1 >= A.col1 
      -- is this row the last in its group? 
      AND NOT EXISTS 
        (SELECT * 
         FROM dbo.T1 AS C 
         WHERE C.col1 = B.col1 + 1))  FROM dbo.T1 AS A;

そして3番目のコード:

SELECT MIN(col1) AS start_range, MAX(col1) AS end_range 
FROM (SELECT col1,  
        -- the difference is constant and unique per island 
        col1 - ROW_NUMBER() OVER(ORDER BY col1) AS grp 
      FROM dbo.T1) AS D 
GROUP BY grp;

使い方?最初のコードと同じ結果を示しています。2番目と4番目のコードを理解しています。でも、3番目はよくわかりません。そして最初の私の理解は半分です。それ(3番目)はどのように機能しますか?第4:

SELECT col1, col1 - ROW_NUMBER() OVER(ORDER BY col1) AS diff 
FROM dbo.T1; 
4

1 に答える 1