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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top