So gruppieren reichte Werte mithilfe von SQL Server
-
19-08-2019 - |
Frage
Ich habe eine Tabelle von Werten wie folgt
978412, 400
978813, 20
978834, 50
981001, 20
Wie Sie die zweite Nummer sehen können, wenn zum ersten hinzugefügt ist 1 Nummer vor dem nächsten in der Sequenz. Die letzte Zahl ist nicht in dem Bereich (tut eine direkte Folge folgen, wie es in den nächsten Wert). Was ich brauche, ist ein CTE (ja, im Idealfall), dass Wille Ausgang dieser
978412, 472
981001, 20
Die erste Zeile enthält die Startnummer des Bereichs dann die Summe der Knoten innerhalb. Die nächste Reihe ist, den nächsten Bereich, der in diesem Beispiel die gleichen wie die ursprünglichen Daten.
Lösung
Aus dem Artikel, die Josh geschrieben, hier ist mein nehmen (getestet und funktioniert):
SELECT
MAX(t1.gapID) as gapID,
t2.gapID-MAX(t1.gapID)+t2.gapSize as gapSize
-- max(t1) is the specific lower bound of t2 because of the group by.
FROM
( -- t1 is the lower boundary of an island.
SELECT gapID
FROM gaps tbl1
WHERE
NOT EXISTS(
SELECT *
FROM gaps tbl2
WHERE tbl1.gapID = tbl2.gapID + tbl2.gapSize + 1
)
) t1
INNER JOIN ( -- t2 is the upper boundary of an island.
SELECT gapID, gapSize
FROM gaps tbl1
WHERE
NOT EXISTS(
SELECT * FROM gaps tbl2
WHERE tbl2.gapID = tbl1.gapID + tbl1.gapSize + 1
)
) t2 ON t1.gapID <= t2.gapID -- For all t1, we get all bigger t2 and opposite.
GROUP BY t2.gapID, t2.gapSize
Andere Tipps
Sehen Sie sich diese MSDN Artikel . Es gibt Ihnen eine Lösung für Ihr Problem, wenn es für Sie auf der ammount von Daten abhängig arbeiten Sie und Ihre Leistungsanforderungen für die Abfrage haben.
Edit:
Verwendung Nun das Beispiels in der Abfrage, und gehe mit seiner letzten Lösung den zweiten Weg Inseln zu erhalten (erster Weg führte zu einem Fehler auf SQL 2005).
SELECT MIN(start) AS startGroup, endGroup, (endgroup-min(start) +1) as NumNodes
FROM (SELECT g1.gapID AS start,
(SELECT min(g2.gapID) FROM #gaps g2
WHERE g2.gapID >= g1.gapID and NOT EXISTS
(SELECT * FROM #gaps g3
WHERE g3.gapID - g2.gapID = 1)) as endGroup
FROM #gaps g1) T1 GROUP BY endGroup
Das, was ich hinzugefügt ist (endgroup-min(start) +1) as NumNodes
. Dies gibt Ihnen die Zählungen.