;
Nehmen wir als Beispiel, das aus dem oben genannten technischen Bericht übernommen wurde, an, dass Sie eine Tabelle dbo.Ticker mit Spaltensymbol, Handelsdatum und Preis erhalten. Verwenden Sie den folgenden Code, um die Tabelle zu erstellen, füllen Sie sie mit einigen Beispieldaten und fragen Sie sie ab:
SET NOCOUNT ON; TEMPDB VERWENDEN; DROP TABLE IF EXISTS dbo.Ticker; CREATE TABLE dbo.Ticker( symbol VARCHAR(10) NOT NULL, tradedate DATE NOT NULL, price NUMERIC(12, 2) NOT NULL, CONSTRAINT PK_Ticker PRIMARY KEY (symbol, tradedate));GO INSERT INTO dbo.Ticker(symbol, tradedate , Preis) WERTE ('AKTIE1', '20190212', 150,00), ('AKTIE1', '20190213', 151,00), ('AKTIE1', '20190214', 148,00), ('AKTIE1', '20190215', 146,00). ), ('Aktie1', '20190218', 142,00), ('Aktie1', '20190219', 144,00), ('Aktie1', '20190220', 152,00), ('Aktie1', '20190221', 152,00), ('Aktie1', '20190222', 153,00), ('Aktie1', '20190225', 154,00), ('Aktie1', '20190226', 154,00), ('Aktie1', '20190227', 154,00), (' AKTIEN1', '20190228', 153,00), ('AKTIEN1', '20190301', 145,00), ('AKTIEN1', '20190304', 140,00), ('AKTIEN1', '20190305', 142,00), ('AKTIEN1' , '20190306', 143,00), ('Aktie1', '20190307', 142,00), ('Aktie1', '20190308', 140,00), ('Aktie1', '20190311', 138,00), ('Aktie2', ' 20190212', 330,00), ('AKT2', '20190213', 329,00), ('AKT2', '20190214', 329.00) , ('Aktie2', '20190221', 326,00), ('Aktie2', '20190222', 320,00), ('Aktie2', '20190225', 317,00), ('Aktie2', '20190226', 319,00), ( „AKT2“, „20190227“, 325,00), („AKT2“, „20190228“, 322,00), („AKT2“, „20190301“, 324,00), („AKT2“, „20190304“, 321,00), („AKT2 ', '20190305', 319,00), ('AKTIEN2', '20190306', 322,00), ('AKTIEN2', '20190307', 326,00), ('AKTIEN2', '20190308', 326,00), ('AKTIEN2', '20190311', 324,00); WÄHLEN Sie Symbol, Handelsdatum, Preis AUS dbo.Ticker;
Dieser Code generiert die folgende Ausgabe:
Symbol Handelstagpreis------ ---------- ------ STOCK1 2019-02-12 150,00 STOCK1 2019-02-13 151,00 STOCK1 2019-02-14 148,00 STOCK1 2019-02-15 146.00Stock1 2019-02-18 142.00Stock1 2019-02-19 144.00Stock1 2019-02-20 152.00Stock1 2019-02-21 152.00Stock1 2019-02-22 153.00Stock1 2019-02-25 154.00Stock1 2019 2019 2019 2019 2019 2019 -02-26 154,00 LAGER1 2019-02-27 154,00 LAGER1 2019-02-28 153,00 LAGER1 2019-03-01 145,00 LAGER1 2019-03-04 140,00 LAGER1 2019-03-05 142,00 LAGER1 09-1.06 ST4-06 ST4-06 03-07 142.00Stock1 2019-03-08 140.00Stock1 2019-03-11 138.00Stock2 2019-02-12 330.00Stock2 2019-02-13 329.00Stock2 2019-02-14 329.00Stock2 2019-02-15 326.00Stock2 2019-022. -18 325,00 LAGER2 2019-02-19 326,00 LAGER2 2019-02-20 328,00 LAGER2 2019-02-21 326,00 LAGER2 2019-02-22 320,00 LAGER2 2019-02-25 317,00 LAGER2 2019-02-26 27 325,00 LAGER2 2019-02-28 322,00 LAGER2 2019-03-01 324,00 LAGER2 2019-03-04 321,00 LAGER2 2019-03-05 319,00 LAGER2 2019-03-06 322.00STOCK2 2019-03-07 326.00STOCK2 2019-03-08 326.00STOCK2 2019-03-11 324.0040 Zeile(n) betroffen.
Die folgende Abfrage identifiziert Muster, die V-Formen im Aktienkurs darstellen (ein Zeitraum mit streng fallendem Kurs, gefolgt von einem Zeitraum mit streng steigendem Kurs), wobei ONE ROW PER MATCH als Zeilenmuster rows per match verwendet wird Möglichkeit:
SELECT MR.symbol, MR.matchnum, MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR.maxpriceFROM dbo.Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tradedate MEASURES MATCH_NUMBER() AS matchnum, A.tradedate AS startdate, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B.price) AS bottomprice, LAST(C.tradedate) AS enddate, -- das gleiche wie LAST(tradedate) LAST(C.price) AS endprice, MAX(U.price) AS maxprice -- dasselbe wie MAX(price) EINE REIHE PRO ÜBEREINSTIMMUNG -- standardmäßig NACH DEM SPIEL ÜBER LETZTE REIHE ÜBERSPRINGEN -- standardmäßiges MUSTER (A B+ C+ ) SUBSET U =(A, B, C) DEFINE – A ist standardmäßig True, stimmt mit jeder Zeile überein, genauso wie die explizite Definition von A AS 1 =1 B AS B.price PREV(C.price) ) AS MR;
Die Klausel PARTITION BY definiert, dass Sie jedes Aktiensymbol separat behandeln möchten.
Die ORDER BY-Klausel definiert die Reihenfolge basierend auf dem Handelsdatum.
Die DEFINE-Klausel definiert Zeilenmustervariablen, die die verschiedenen Untersequenzen von Zeilen im Muster darstellen. Im obigen Beispiel stellt A eine beliebige Zeile als Ausgangspunkt dar, B stellt eine Teilfolge fallender Preise dar (B.price PREV( C.Preis)).
Die PATTERN-Klausel verwendet reguläre Ausdrücke, um ein Muster zu identifizieren. In der obigen Abfrage ist das Muster (A B+ C+), was bedeutet (jede Reihe, gefolgt von einer oder mehreren Reihen mit fallenden Preisen, gefolgt von einer oder mehreren Reihen mit steigenden Preisen). Im Folgenden finden Sie Musterquantifizierer für reguläre Ausdrücke, die Sie verwenden können:
* — null (0) oder mehr Übereinstimmungen+ — eine (1) oder mehr Übereinstimmungen? — keine Übereinstimmung oder eine (1) Übereinstimmung, optional{ n } — genau n Übereinstimmungen{ n, } — n oder mehr Übereinstimmungen{ n, m } — zwischen n und m (einschließlich) Übereinstimmungen{ , m } — zwischen null (0 ) und m (inklusive) Übereinstimmungen{- Variable -}, z. B. {- A -} — gibt an, dass übereinstimmende Zeilen von der Ausgabe ausgeschlossen werden sollen (nur nützlich, wenn ALL ROW PER MATCH angegeben ist)|, z. B. A | B – Alternation(), z. B. (A | B) – Gruppierung^, z. B. ^A{1, 3} – Beginn eines Zeilenmusters partition$, z. B. A{1, 3}$ – Ende eines Zeilenmusters Partition
Standardmäßig sind die Quantifizierer gierig, aber Sie können sie als widerstrebend definieren.
Mit der SUBSET-Klausel können Sie eine benannte Teilmengenliste von Variablen definieren.
Die MEASURES-Klausel definiert Kennzahlen, die sich auf das Muster beziehen. Sie können Berechnungen auf Mustervariablen und Teilmengen anwenden. Die Funktion MATCH_NUMBER() weist den Übereinstimmungen innerhalb der Partition fortlaufende Ganzzahlen zu, beginnend mit 1. Sie können Operationen wie FIRST, LAST, PREV und NEXT sowie aggregierte Berechnungen verwenden.
Diese Abfrage verwendet ONE ROW PER MATCH als Option für das Zeilenmuster Zeilen pro Übereinstimmung. Dies bedeutet, dass die Ergebnistabelle eine Zeile pro Musterübereinstimmung enthält, ähnlich wie das Ergebnis der Gruppierung. Die Alternative ist ALL ROWS PER MATCH, wobei die Detailzeilen pro Musterübereinstimmung zurückgegeben werden sollen (Beispiel folgt in Kürze).
Diese Abfrage verwendet AFTER MATCH SKIP PAST LAST ROW als AFTER MATCH . Das bedeutet, sobald eine Übereinstimmung gefunden wurde, möchten Sie, dass der nächste Versuch nach der letzten Zeile der aktuellen Übereinstimmung beginnt. Es gibt andere Alternativen wie die Suche nach dem nächsten Treffer in der Reihe nach der ersten Reihe des aktuellen Treffers (SKIP TO NEXT ROW) oder das Springen zu einer Position relativ zu einer Zeilenmustervariablen.
Hier ist die erwartete Ausgabe dieser Abfrage:
symbol matchnum startdate startprice bottomdat bottomprice enddate endprice maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------LAGER1 1 2019-02-13 151.00 2019-02-18 142.00 2019-02-20 152.00 152.00Stock1 2 2019-02-27 154.00 2019-03-04 140.00 2019-03-06 143.00 154.00Stock2 1 2019-02-14 329.00 2019-02-18 325.00 2019 2019 2019 2019 2019 2019 2019 2019 2019 2019 -02-20 328.00 329.00Stock2 2 2 2019-02-21 326.00 2019-02-25 317.00 2019-02-27 325.00 326.00Stock2 3 2019-03-01 324.00 2019-03-05 319.00 2019-03-07 326.00 326.00 00 00 00 00 00 39-03-07 326.00 326.00 00 00 00 00 00 00 00 00 00 00 00 00 00 2019-03-07 326.00 326.00; vor>
Hier ist eine leicht modifizierte Version der Abfrage mit der Option ALL ROWS PER MATCH:
SELECT MR.symbol, MR.tradedate, MR.price, MR.matchnum, MR.classy, MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR. maxpriceFROM dbo.Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tradedate MEASURES MATCH_NUMBER() AS matchnum, CLASSIFIER() AS classy, A.tradedate AS startdate, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B. price) AS bottomprice, LAST(C.tradedate) AS enddate, LAST(C.price) AS endprice, MAX(U.price) AS maxprice (A, B, C) DEFINE B AS B.price PREV(C.price) ) AS MR;
Hier ist die erwartete Ausgabe dieser Abfrage:
Symbol tradedate price matchnum classy startdate startprice bottomdate bottomprice enddate endprice maxprice ------ ---------- ------ -------- ----- - ---------- ---------- ---------- ----------- -------- -- --------- --------STOCK1 2019-02-13 151,00 1 A 2019-02-13 151,00 NULL NULL NULL NULL 151,00STOCK1 2019-02-14 148,00 1 B 2019- 02-13 151.00 2019-02-14 148.00 NULL NULL 151.00LAGER1 2019-02-15 146.00 1 B 2019-02-13 151.00 2019-02-15 146.00 NULL NULL 151.00LAGER1 2019-02-18 13 151.00 2019-02-18 142.00 NULL NULL 151.00 STOCK1 2019-02-19 144.00 1 C 2019-02-13 151.00 2019-02-18 142.00 2019-02-19 144.00 151.00Stock1 2019-02-20 152.00 1 C 2019-2019-19-19-19-19-19-19-19-19-19. 02-13 151,00 2019-02-18 142,00 2019-02-20 152,00 152,00LAGER1 2019-02 -27 154,00 2 A 2019-02-27 154,00 NULL NULL NULL NULL 154,00 STOCK1 2019-02-28 153,00 2 B 2019-02-27 154,00 2019-02-28 153,00 NULL NULL 154,00 STOCK1 3-01 9.02 2019-0 -02-27 154.00 2019-03-01 145.00 NULL NULL 154.00LAGER1 2019-03-04 140.00 2 B 2019-02-27 154.00 2019-03-04 140.00 NULL NULL 154.00LAGER1 2019-03-05 -27 154.00 2019-03-04 140.00 2019-03-05 142.00 154.00Stock1 2019-03-06 143.00 2 C 2019-02-27 154.00 2019-03-04 140.00 2019-06 143.00 154.00stock2 2019-02-14 329,00 1 A 2019-02-14 329,00 NULL NULL NULL NULL 329,00 STOCK2 2019-02-15 326,00 1 B 2019-02-14 329,00 2019-02-15 326,00 NULL NULL 329,00 STOCK2 2019-02-1 2019-02-14 329.00 2019-02-18 325.00 NULL NULL 329.00 STOCK2 2019-02-19 326.00 1 C 2019-02-14 329.00 2019-02-18 325.00 2019-02-19 326.00 329.00Stock2 2019-02-2-2-228.00 1 C 2019-02-14 329,00 2019-02-18 325,00 2019-02-20 328,00 329,00 STOCK2 2019-02-21 326,00 2 A 2019-02-21 326,00 NULL NULL NULL NULL 326,00 ST92 2-0 B 02-21 326.00 2019-02-25 317.00 2019-02-26 319.00 326.00STOCK2 2019-02-27 325.00 2 C 2019-02-21 326.00 2019-02-25 317.00 2019-02-27 325.00 326.00STOCK2 2019-03- 01 324,00 3 A 2019-03-01 324,0 0 NULL NULL NULL NULL 324,00 STOCK2 2019-03-04 321,00 3 B 2019-03-01 324,00 2019-03-04 321,00 NULL NULL 324,00 STOCK2 2019-03-05 319,00 3 B 2019-03-01 3205.9 3205-0 3205.9 319.00 NULL NULL 324.00STOCK2 2019-03-06 322.00 3 C 2019-03-01 324.00 2019-03-05 319.00 2019-03-06 322.00 324.00STOCK2 2019-03-07 326.00 3 C 2019-03-01 324.00 2019-03 -05 319,00 2019-03-07 326,00 326,0027 Zeile(n) betroffen.
Beachten Sie die Hinzufügung der Kennzahl classy basierend auf der Funktion CLASSIFIER. Diese Funktion gibt einen String zurück, der die Zeilenmustervariable darstellt, der die Ergebniszeile zugeordnet ist (in unserem Fall A, B oder C).
Feature R020, „Zeilenmustererkennung:WINDOW-Klausel“
Feature R020 verwendet Zeilenmustererkennung als Teil der Windowing-Klausel OVER (oder WINDOW-Klausel beim Benennen einer Fensterspezifikation), um einen Fensterrahmen weiter einzuschränken. So wie die Fensterpartition die Zeilen des Eingabetabellenausdrucks (FROM… WHERE… GROUP BY… HAVING) einschränkt und der Fensterrahmen die Fensterpartition weiter einschränkt, schränken Sie mit Merkmal R020 den vollständigen Fensterrahmen weiter auf einen reduzierten Fensterrahmen ein der Unterfolge von Zeilen, die die Musterübereinstimmung bilden. Hier ist eine Abfrage, die diese Funktion mit der WINDOW-Klausel demonstriert, wobei eine ähnliche Spezifikation für den Zeilenmusterabgleich wie die in der ersten Abfrage in diesem Artikel verwendete verwendet wird:
SELECT T.symbol, T.tradedate, T.price, startdate OVER W, startprice OVER W, bottomdate OVER W, bottomprice OVER W, enddate OVER W, endprice OVER W, maxprice OVER WFROM dbo.Ticker TWINDOW W AS ( PARTITION BY symbol ORDER BY tradedate MASSNAHMEN A.tradedate AS Startdatum, A.price AS Startpreis, LAST(B.tradedate) AS Bottomdate, LAST(B.price) AS Bottomprice, LAST(C.tradedate) AS Enddate, LAST(C.tradedate) AS enddate, LAST(C.tradedate) AS enddate price) AS endprice, MAX(U.price) AS maxprice ZEILEN ZWISCHEN DER AKTUELLEN REIHE UND UNBEGRENZT FOLGEND NACH DER ÜBEREINSTIMMUNG ÜBERSPRINGEN DER LETZTEN REIHE INITIAL -- Muster muss in der ersten Reihe des vollständigen Fensterrahmens beginnen; Alternative ist SEEK PATTERN (A B+ C+) SUBSET U =(A, B, C) DEFINE B AS B.price PREV(C.price) );
Bei Verwendung der Zeilenmustererkennung mit Fensterung muss der vollständige Fensterrahmen bei der aktuellen Zeile beginnen. Beachten Sie die Verwendung der Option INITIAL in dieser Abfrage. Diese Option bedeutet, dass Sie nur dann eine Übereinstimmung erhalten, wenn das Muster mit der aktuellen Zeile beginnt. Die Alternative ist SEEK, was bedeutet, dass eine Suche nach einer Übereinstimmung mit der aktuellen Zeile beginnt, aber bis zum Ende des vollständigen Fensterrahmens zulässig ist. In jedem Fall besteht der reduzierte Fensterrahmen, wenn eine Übereinstimmung gefunden wird, nur aus den Musterübereinstimmungszeilen, andernfalls ist der reduzierte Fensterrahmen leer. Es wird nur eine Zeilenmusterübereinstimmung pro vollständigem Fensterrahmen gesucht.
Beachten Sie in der SELECT-Liste der Abfrage, dass Sie Maße zurückgeben können, die in der MEASURES-Klausel definiert sind und über W berechnet werden, was dem reduzierten Fensterrahmen entspricht.
Erinnern Sie sich an das Ergebnis der ersten Abfrage in diesem Artikel, indem Sie die Zeilenmustererkennung in der FROM-Klausel mit der Option ONE ROW PER MATCH verwenden:
symbol matchnum startdate startprice bottomdat bottomprice enddate endprice maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------LAGER1 1 2019-02-13 151.00 2019-02-18 142.00 2019-02-20 152.00 152.00Stock1 2 2019-02-27 154.00 2019-03-04 140.00 2019-03-06 143.00 154.00Stock2 1 2019-02-14 329.00 2019-02-18 325.00 2019 2019 2019 2019 2019 2019 2019 2019 2019 2019 -02-20 328.00 329.00Stock2 2 2 2019-02-21 326.00 2019-02-25 317.00 2019-02-27 325.00 326.00Stock2 3 2019-03-01 324.00 2019-03-05 319.00 2019-03-07 326.00 326.00 00 00 00 00 00 39-03-07 326.00 326.00 00 00 00 00 00 00 00 00 00 00 00 00 00 2019-03-07 326.00 326.00; vor>
Hier ist die erwartete Ausgabe unserer letzten Abfrage unter Verwendung der Zeilenmustererkennung in der WINDOW-Klausel:
Symbol Handelsdatum Preis Startdatum Startpreis Tiefstdatum Tiefstpreis Enddatum Endpreis Höchstpreis ------ ---------- ------ ---------- ----- ----- ---------- ----------- ---------- -------- ------ --STOCK1 2019-02-12 150.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-13 151.00 2019-02-13 151.00 2019-02-18 142.00 2019-02-20 152.00 152.00STOCK1 2-019 N.14 N.14 NULL NULL NULL NULL NULLSTOCK1 2019-02-15 146.00 NULL NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-18 142.00 NULL NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-19 144.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02.50 2019-02.10.2019-02.18 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-21 152,00 NULL NULL NULL NULL N ULL NULL NULLSTOCK1 2019-02-22 153,00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-25 154,00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-26 154,00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-27 154,00 02-27 154,00 2019-03-04 140,00 2019-03-06 143,00 154,00STOCK1 2019-02-28 153,00 NULL NULL NULL NULL NULL NULL NULLLAGER1 2019-03-01 145,00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-03-05 142,00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-03-06 143,00 NULL NULL NULL NULL NULL NULL NULL STOCK1 2019-03-07 142,00 NULL NULL NULL N ULL NULL NULL NULL STOCK1 2019-03-08 140.00 NULL NULL NULL NULL NULL NULL NULL STOCK1 2019-03-11 138.00 NULL NULL NULL NULL NULL NULL NULL NULL STOCK2 2019-02-12 330.00 NULL NULL NULL NULL NULL NULL NULL STOCK2 2019-02-130 02.09 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 325.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-19 326.00 NULL NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-20 328.00 NULL NULL NULL NULL NULL NULL NULL STOCK2 2019-02-21 326.00 2019-02.21 326 019-02-25 317.00 2019-02-27 325.00 326.00AKT2 2019-02-22 320.00 NULL NULL NULL NULL NULL NULL NULL NULL2 2019-02-25 317.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 26 NULL NULL NULLSTOCK2 2019-02-27 325,00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-28 322,00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-01 324,00 2019-03-01 324,00 2019-03-05 -07 326,00 326,00Aktie2 2019-03-04 321,00 NULL NULL NULL NULL NULL NULL NULL STOCK2 2019-03-05 319,00 NULL NULL NULL NULL NULL NULL NULL STOCK2 2019-03-06 322,00 NULL NULL NULL NULL NULL NULL NULL90 3-01-307 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-08 326,00 NULL NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-11 324,00 NULL NULL NULL NULL NULL NULL NULL40 Zeile(n) betroffen.
Beachten Sie, dass Sie alle detaillierten Zeilen in der Ausgabe erhalten, und wo eine Musterübereinstimmung beginnt, erhalten Sie das Ergebnis der angeforderten Zeilenmustermessungen gegen den reduzierten Fensterrahmen.
Geben Sie Ihre Stimme ab
Es versteht sich von selbst, dass es für Microsoft eine ziemlich bedeutende Investition ist, T-SQL eine Funktion hinzuzufügen – insbesondere eine so umfangreiche. Aber das Tolle an Funktionen, die zu T-SQL hinzugefügt werden, ist, dass sie so ziemlich für immer dort bleiben. Es gibt eine riesige Community, die nach T-SQL-Verbesserungen wie dieser hungert.
Wenn Sie der Meinung sind, dass die Zeilenmustererkennung eine wichtige Ergänzung zu SQL Server ist, sollten Sie unbedingt Ihre Stimme abgeben. Außerdem priorisiert Microsoft eher eine vorgeschlagene Funktion, wenn sie Kunden und Anwendungsfälle kennt, die davon profitieren könnten, und dass diese Kunden im Moment entweder andere Produkte oder komplexere Lösungen verwenden. Wenn Sie oder Ihre Kunden RPR als vorteilhaft für Sie ansehen und Anwendungsfälle haben, die Sie teilen können, stellen Sie sicher, dass Sie Kommentare zum Feedbackelement hinzufügen und Microsoft dies mitteilen.