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;