2013-06-11 4 views
7

Ich habe eine Tabelle mit der folgenden DefinitionWie finden Sie die Grenzen von Gruppen von zusammenhängenden fortlaufenden Nummern?

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

und Beispieldaten

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) 

nur in den Reihen, wo status = 0, wie ich die Number Werte in Bereiche von benachbarten aufeinanderfolgenden Zahlen zusammengedrückt werden und finde die Anfang und Ende jedes Bereichs?

d Für die Beispieldaten würden die Ergebnisse

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

Ich habe das schon vor Monaten gemacht. Ich glaube nicht, dass ich die Abfrage gespeichert habe, aber es könnte immer noch in meinen lokalen Logs sein. Festhalten. –

+3

Google nach "SQL Server Lücken und Inseln" – OzrenTkalcecKrznaric

+0

Entschuldigung, ich kann es nicht finden. –

Antwort

25

Wie in den Kommentaren erwähnt, dies eine klassische Lücken und Inseln Problem ist.

Eine von Itzik Ben Gan popularisierte Lösung ist die Tatsache, dass ROW_NUMBER() OVER (ORDER BY number) - number innerhalb einer "Insel" konstant bleibt und nicht in mehreren Inseln vorkommen kann.

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) 

NB: Wenn number nicht eindeutig garantiert ersetzen seine ROW_NUMBER mit DENSE_RANK in dem obigen Code.

+0

+1: Ja, das ist der beste Ansatz. Keine verfluchten Cursor oder ineffiziente Rekursion notwendig. – RBarryYoung

+0

Dein Genie-Mann! Vielen Dank –

+3

Hier ist einer der Orte, über die Itzak spricht: http://www.sqlmag.com/article/tsql3/calculating-concurrent-sessions-part-3. Ich werde nicht erwähnen, wem er mit der Lösung des Problems angerechnet hat (neben Ben Flanaghan und Arnold Fribble). ;-) – RBarryYoung

Verwandte Themen