Wählen Sie einen Assoziator alle Zeilen zwischen einem bestimmten Wert aus

Ich habe eine Spalte in einer Tabelle mit den folgenden Beispieldaten:

20170426-31974-B 20170426-31980 20170426-32014 20170426-32609 20170426-32069-B 20170426-32649 20170426-32659 20170426-32669-B 20170426-32849 

Die Werte mit -B sind referencewerte. Alle anderen fileen (ohne -B) sollten eine referencedatei haben. Also sollte die ganze Lücke zwischen den referenceen (-B) mit dem vorherigen "-B" verbunden sein.

  • Gibt es sowieso, über die Abfrage, die Zeilen zu einer reference "-B" zuzuordnen?

Was meine ich:

 20170426-31980 -> reference to 20170426-31974-B 20170426-32014 -> reference to 20170426-31974-B 20170426-32609 -> reference to 20170426-31974-B 20170426-32649 -> reference to 20170426-32069-B 20170426-32659 -> reference to 20170426-32069-B 20170426-32849 -> refence to 20170426-32669-B 

Mit anderen Worten, ich muss alle fileen zwischen -B bekommen. Alle diese fileen sollten mit dem vorherigen -B verbunden sein.

Eine Auswahl sollte so etwas zurückgeben

 20170426-31980 || 20170426-31974-B 20170426-32014 || 20170426-31974-B 20170426-32609 || 20170426-31974-B 20170426-32649 || 20170426-32069-B 20170426-32659 || 20170426-32069-B 20170426-32849 || 20170426-32669-B 

Ich habe diese Idee ausprobiert:

 SELECT FILE_NAME FROM TBL_FILE_NAMES CROSS APPLY(SELECT FILE_NAME) FROM TBL_FILE_NAMES WHERE file_name LIKE '%-B') CA_min(file_name) CROSS APPLY(SELECT FILE_NAME) FROM TBL_FILE_NAMES WHERE file_name LIKE '%-B') CA_max(file_name) WHERE [DATE] BETWEEN start_dt AND end_dt 

Aber ich glaube, dass meine Logik falsch ist. Soll ich versuchen, einen Cursor anstelle von Abfrage zu verwenden?


Nach einigen Kommentaren, die Bestellung Materie. Diese Namen werden in Bezug auf eine time erstellt. Der erste Teil der file ist der yearmonthday-Sekunden. Mein Problem ist, dass jede file eine reference (-B) haben sollte. Wie wissen Sie, welche fileen mit B verbunden sind? Es sind die data zwischen den referencedateien.

 20170426-31974-B.csv 20170426-31980.csv 20170426-31987.csv 20170426-31994.csv 20170426-32004.csv 20170426-32014.csv 20170426-32069-B.csv 20170426-32073.csv 20170426-32079.csv 20170426-32639.csv 20170426-32659.csv 20170426-32669-B.csv 20170426-32674.csv 

In diesem Fall habe ich meine erste reference 20170426-31974-B.csv. Alle kommenden fileen (in der Reihenfolge nach time), bis wir eine zweite reference erreichen, sollte auf die erste reference verweisen.

  1. reference 1 = 20170426-31974-B.csv

Werte mit

 20170426-31980.csv 20170426-31987.csv 20170426-31994.csv 20170426-32004.csv 20170426-32014.csv 
  1. reference 2 = 20170426-32069-B.csv

Werte verknüpfen mit

 20170426-32073.csv 20170426-32079.csv 20170426-32639.csv 20170426-32659.csv 
  1. Bezugszeichen 3: 20170426-32669-B.csv

Werte mit

 20170426-32674.csv 

Versuchen

 declare @t table(col varchar(100)); insert @t(col) values ('20170426-31974-B') ,('20170426-31980') ,('20170426-32014') ,('20170426-32609') ,('20170426-32069-B') ,('20170426-32649') ,('20170426-32659') ,('20170426-32669-B') ,('20170426-32849'); with parent as ( select col, strt = left(col,14), nxt = coalesce(left(lead(col) over(order by col), 14), '99999999-99999') from @t where right(col,2) ='-B' ) select parent.col, t1.col from parent -- left -- probably join @t t1 on len(t1.col) = 14 and t1.col between parent.strt and parent.nxt order by parent.col, t1.col 

Basierend auf der Beschreibung, denke ich, das ist was du suchst …

 IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL DROP TABLE #TestData; CREATE TABLE #TestData ( SomeValue VARCHAR(20) NOT NULL PRIMARY KEY CLUSTERED ); INSERT #TestData (SomeValue) VALUES ('20170426-31974-B.csv'), ('20170426-31980.csv'), ('20170426-32014.csv'), ('20170426-32609.csv'), ('20170426-32069-B.csv'), ('20170426-32649.csv'), ('20170426-32659.csv'), ('20170426-32669-B.csv'), ('20170426-32849.csv'); -- SELECT * FROM #TestData td; --================================== WITH cte_BaseStarts AS ( SELECT td.SomeValue, BaseValue = IIF(RIGHT(td.SomeValue, 5) = 'B.csv', td.SomeValue, NULL) FROM #TestData td ), cte_FillAssocBase AS ( SELECT bs.SomeValue, AssocBaseValue = MAX(bs.BaseValue) OVER (ORDER BY bs.SomeValue ASC) FROM cte_BaseStarts bs ) SELECT fab.SomeValue, fab.AssocBaseValue FROM cte_FillAssocBase fab WHERE fab.SomeValue NOT LIKE '%B.csv';