Suche nach fortlaufenden Bereichen in einer Reihe von Zahlen

7

Ich habe eine ziemlich große Anzahl von Telefonnummern (ungefähr 2 Millionen) in einer Datenbanktabelle. Diese Zahlen wurden in Blöcken eingefügt, so dass es viele kontinuierliche Zahlenbereiche gibt, alles von 10 bis 10 000 in einem Bereich. Einige dieser Nummern werden verwendet und sind daher als nicht verfügbar gekennzeichnet, der Rest ist verfügbar. Bei einer bestimmten Nummer brauche ich einen Weg, um kontinuierliche Zahlenbereiche zu finden, sowohl oberhalb als auch unterhalb dieser Zahl. Der Bereich sollte fortgesetzt werden, bis eine nicht verfügbare Nummer gefunden wird oder die Grenze von zwei Bereichen erreicht wird.

Zum Beispiel die folgende Menge gegeben:

%Vor%

Eine Suche mit 1012 als Parameter sollte 1010, 1011, 1012, 1013 zurückgeben.

Was ist eine gute Möglichkeit, eine Abfrage zu erstellen, um diese Bereiche zu finden? Wir verwenden NHibernate auf dem SQL-Server, eine Lösung, die beide verwendet, ist in Ordnung.

    
Jack Ryan 29.06.2010, 09:16
quelle

4 Antworten

18

Theoretisch haben die Elemente in einem Set keinen bestimmten Wert, daher nehme ich an, dass Sie auch eine fortlaufende ID-Spalte haben, die die Reihenfolge der Zahlen definiert. Etwas wie das:

%Vor%

Sie könnten eine zusätzliche Spalte erstellen, die das Ergebnis von Number - ID enthält:

%Vor%

Zahlen in demselben Bereich haben das gleiche Ergebnis in der Diff-Spalte.

    
Niels van der Rest 29.06.2010, 09:42
quelle
1

SQL kann dies in einer einzigen Abfrage nicht wirklich tun (außer es gibt native SQL-Erweiterungen, von denen ich nichts weiß), weil SQL nicht auf die Zeile 'vor' oder 'nach' zugreifen kann.

Sie müssen die Sequenz in einer Schleife durchlaufen.

Sie können NHibernates Enumerable versuchen, die die Entitäten nicht in den Speicher lädt, sondern nur Proxies von ihnen erstellt. Eigentlich denke ich nicht, dass es eine gute Idee ist, denn es wird Proxies für die ganzen 2 Millionen Zahlen erzeugen.

Planen Sie B, verwenden Sie Paging. Grob sieht es so aus:

%Vor%

Und das gleiche für den Bereich vorher in die andere Richtung.

    
Stefan Steinegger 29.06.2010 09:30
quelle
0

Wenn Sie den SQL-Server verwenden, sollten Sie in der Lage sein, eine rekursive Abfrage zu erstellen auf root.number = Blatt.Nummer + 1

Wenn Sie die Nummer aus der Wurzel und aus der letzten Rekursion und der Rekursionsstufe auswählen, sollten Sie eine funktionierende Anfrage haben.

Ich würde zuerst die Leistung testen und dann, wenn nicht befriedigend, den cursor / zeilenbasierten Ansatz verwenden (was in diesem Fall einen Job mit einem einzigen vollständigen Scan tun würde, bei dem die Rekursion durch Erreichen der maximalen Rekursionstiefe fehlschlagen kann) / p>

Andernfalls besteht die Möglichkeit, Daten anders zu speichern und eine Liste von Min- und Max-Nummern zu verwalten, die mit einer Tabelle verknüpft sind.

Dies könnte tatsächlich in Triggern implementiert werden, die bei Einzelzeilen-Aktualisierungen keine so hohe Strafe erfordern (Aktualisierungen in der einzelnen Zeile der Basistabelle würden entweder eine Zeile in der Min-Max-Tabelle aktualisieren, löschen oder aufteilen; dies kann bestimmt werden) indem nur die 'vorherige' und 'nächste' Zeile abgefragt wird.

    
Unreason 29.06.2010 09:34
quelle
0

Verwenden Sie eine Hilfstabelle aller möglichen sequentiellen Werte oder materialisieren Sie eine in einem CTE, z.

%Vor%     
onedaywhen 29.06.2010 14:18
quelle

Tags und Links