2016-05-23 10 views
-1

Ich habe einen Datensatz, wie dieseWie zähle aufeinanderfolgende Zeile, wo eine Spalte einen bestimmten Wert in SQL Server hat?

gId mId 
226 88825 
226 88825 
226 88825 
226 88825 
226 88825 
226 88825 
226 88832 
226 88832 
226 88832 
226 88832 
226 88863 
226 88863 
226 88863 
226 88863 
226 88863 
227 89080 
227 89080 
227 89080 
227 89148 
227 89148 
227 89148 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
229 89267 
229 89318 
229 89322 
231 90257 
231 90340 
231 90350 
247 94318 
247 94318 
249 94642 
249 94642 
249 94642 
249 94400 
249 94642  
249 94642 
249 94642 
249 94642 
249 94642 
249 94642 
249 94400 
249 94400 
249 94400 
249 94400 

ich eine Liste der einzigartigen gId Spalte bekommen müssen in der Lage sieht, wo die mId Spalte den gleichen Wert in 5 oder mehr aufeinander folgende Zeilen enthält. So dass die obige Datensatz wird so etwas wie diese

gId mId 
226 88825 
226 88863 
249 94642 

Ein wichtige Sache zurückkehren zu erwähnen, dass ich nicht die Reihenfolge dieser Liste ändern kann, damit ich es zählen muß von oben nach unten für aufeinanderfolgende Zeilen zu überprüfen, um die Lage sein, .

Meine Tabelle sieht wie folgt aus

CREATE TABLE t (
    gId int NOT NULL, 
    mId int NOT NULL 
); 
+4

SQL-Tabellen * ungeordnete * Tabellen darstellen . Es gibt kein Konzept für leitfähige Zeilen, es sei denn, eine andere Spalte gibt die Reihenfolge an. –

+0

Sollten wir annehmen, dass mit '_conservative_ rows' '_consecutive_ rows' gemeint sind? – PinnyM

+0

konsekutiv ist, was ich eingeben wollte. Ich entschuldige mich für diesen Tippfehler. Ich habe gerade meine Frage aktualisiert –

Antwort

2

Wenn Sie eine Version von SQL Server verwenden, die allgemeine Tabellenausdrücke unterstützt, das den Trick tun sollten:

WITH AtLeastFive AS (
    SELECT gId, mId, ROW_NUMBER() OVER (PARTITION BY gId, mId ORDER BY gId, mId) AS RowNum 
    FROM t 
) 
SELECT * FROM AtLeastFive WHERE RowNum =5 
+0

Natürlich, wenn der fortlaufende Faktor von etwas anderem abhängig ist, wie die physische Reihenfolge der Zeilen, müssen Sie eine bestimmende Spalte in der ROW_NUMBER-Funktion ersetzen ... wie eine CreateDate-Spalte. – Shoeless

+0

Danke. Das scheint den richtigen Datensatz zu geben –

+1

Gern geschehen. Es ist wichtig zu verstehen, dass die Reihenfolge der Daten nicht ohne eine entsprechende ORDER BY garantiert werden kann (wie @Tab Alleman in seinem Kommentar zu Ihrer Frage angegeben hat). Vorausgesetzt, dass die gIds physikalisch in Ordnung sein können, aber logisch mit ORDER BY geklärt werden, sind Sie in guter Verfassung :) – Shoeless

Verwandte Themen