2013-06-11 16 views
7

Ben sadece bitişik ardışık sayılar gruplardan Number değerleri daraltmak ve bulmak nasıl status = 0 satır bakıldığındaBitişik sıralı sayı gruplarının sınırları nasıl bulunur?

CREATE TABLE mytable 
    (
    id  INT IDENTITY(1, 1) PRIMARY KEY, 
    number BIGINT, 
    status INT 
) 

ve incelenen örnek, veri

INSERT INTO mytable 
VALUES (100,0), 
     (101,0), 
     (102,0), 
     (103,0), 
     (104,1), 
     (105,1), 
     (106,0), 
     (107,0), 
     (1014,0), 
     (1015,0), 
     (1016,1), 
     (1017,0) 

aşağıdaki tanımıyla, bir tablo her aralığın başlangıcı ve sonu? Bu klasik boşluklar ve adalar sorundur yorum belirtildiği gibi, örneğin veri için

yani sonuçlar

  FROM  to 
Number 100  103 
Number 106  107 
Number 1014  1015 
Number 1017  1017 
+0

Bunu daha önce aylar önce yaptım. Sorguyu kurtardığımı sanmıyorum, ancak yine de yerel günlüklerimde olabilir. Sıkı tutmak. –

+3

google for "sql server boşlukları ve adalar" – OzrenTkalcecKrznaric

+0

üzgünüm bulamıyorum. –

cevap

25

olacaktır.

Itzik Ben Gan tarafından popüler hale getirilen bir çözüm, bir "ada" içinde ROW_NUMBER() OVER (ORDER BY number) - number'un sabit kalması ve birden çok adada görünmemesi gerçeğini kullanmaktır.

WITH T 
    AS (SELECT ROW_NUMBER() OVER (ORDER BY number) - number AS Grp, 
       number 
     FROM mytable 
     WHERE status = 0) 
SELECT MIN(number) AS [From], 
     MAX(number) AS [To] 
FROM T 
GROUP BY Grp 
ORDER BY MIN(number) 

Not: number benzersiz olmasını garanti değilse yukarıdaki kodda DENSE_RANK ile ROW_NUMBER değiştirin.

+0

+1: Evet, bu en iyi yaklaşım. Lanetli İmleçler veya etkisiz özyineleme gerekli değildir. – RBarryYoung

+0

Dehadaki adam! Çok teşekkürler –

+3

Itzak'ın konuştuğu yerlerden biri burada: http://www.sqlmag.com/article/tsql3/calculating-concurrent-sessions-part-3. Kimin çözdüğünü kredilendirdiğinden bahsetmeyeceğim (Ben Flanaghan ve Arnold Fribble'ın yanı sıra). ;-) – RBarryYoung