sql >> Databasteknik >  >> RDS >> Database

Radmönsterigenkänning i SQL

ISO/IEC 9075:2016-standarden, eller SQL:2016 i korthet, introducerar stöd för ett djupgående koncept som kallas Row Pattern Recognition (RPR) i SQL. Jag postade ett förslag för att förbättra SQL Server genom att lägga till stöd för RPR i T-SQL, men jag var ganska begränsad i det utrymme som jag var tvungen att ge feedback. Syftet med den här artikeln är att ge mer information om förslaget, och förhoppningsvis kommer du att bli övertygad om dess betydelse och lägga till din röst.

Bakgrund

På samma sätt som att använda reguljära uttryck för att identifiera mönster i en sträng, använder du med RPR reguljära uttryck för att identifiera mönster i en sekvens av rader. För varje mönstermatchning kan du antingen returnera en sammanfattningsrad som i gruppering, eller de detaljerade raderna, med beräknade mått mot efterföljande av matchningen. RPR har obegränsade praktiska tillämpningar, inklusive att identifiera mönster i aktiemarknadsaktivitet (både giltiga mönster med handelsvärde, och potentiellt olagliga eller misstänkta mönster), hantering av tidsserier, upptäckt av bedrägerier, materialhantering, fraktapplikationer, DNA-sekvensering, luckor och öar, topp N per grupp och många andra.

För mig är RPR nästa steg i utvecklingen av fönsterfunktioner, med en högre nivå av sofistikering och utökad användbarhet. Om du tror att fönsterfunktioner är djupgående och användbara, kommer RPR verkligen att baka din nudel. I likhet med fönsterfunktioner stöder RPR partitionering och beställning. Du kommer vanligtvis att leta efter mönstermatchningar inom varje partition oberoende, baserat på den angivna ordningen. Likaså likt fönsterfunktioner lämpar sig RPR för bra optimering, med möjligheten att förlita sig på indexordning för att undvika sortering av data.

Du kan hitta täckning av RPR, inklusive illustrerade exempel, i en 90-sidig teknisk rapport ISO/IEC TR 19075-5 (tillgänglig gratis).

Du kan också hitta den som en del av dokumentet ISO/IEC 9075-2:2016, Informationsteknologi — Databasspråk — SQL — Del 2:Foundation (SQL/Foundation) (finns att köpa).

SQL:2016-standarden tillhandahåller två huvudsakliga RPR-relaterade funktioner:

  • Funktion R010, "Radmönsterigenkänning:FROM-sats"
  • Funktion R020, "Radmönsterigenkänning:WINDOW-sats"

Standarden nämner också funktion R030, "Row pattern recognition:full aggregate support", utan vilken aggregerade funktioner inte tillåts specificera DISTINCT eller .

Än så länge är den enda plattformen jag känner till den implementerade funktionen R010 Oracle. Jag känner inte till någon plattform som implementerat R020 än.

Funktion R010, "Radmönsterigenkänning:FROM-sats"

Funktion R010 definierar en sats-/tabelloperator som heter MATCH_RECOGNIZE, som du använder i FROM-satsen. Ingången är en tabell eller ett tabelluttryck, och utdata är en virtuell tabell. Kontexten liknar den för andra tabelloperatorer som JOIN, APPLY, PIVOT och UNPIVOT. Här är syntaxen för en fråga som använder den här funktionen:

VÄLJ  FRÅN  MATCH_RECOGNIZE ( [ PARTITION BY  ] [ ORDER BY  ] [ MEASURES  ] [  ::=EN RADER PER MATCH | ALLA RADER PER MATCH ] [ EFTER MATCH  MÖNSTER (  ) [ DELMÄNGD  ] DEFINIERA  ) SOM ;

Som ett exempel anpassat från den tidigare nämnda tekniska rapporten, anta att du får en tabell dbo.Ticker, med kolumner symbol, handelsdatum och pris. Använd följande kod för att skapa tabellen, fylla i den med några exempeldata och fråga den:

STÄLL IN NOCOUNT PÅ; ANVÄND tempdb; SLIPP TABELL OM FINNS dbo.Ticker; CREATE TABLE dbo.Ticker( symbol VARCHAR(10) NOT NULL, handelsdatum INTE NULL, pris NUMERIC(12, 2) NOT NULL, BEGRÄNSNING PK_Ticker PRIMÄRNYCKEL (symbol, handelsdatum));GO INSERT INTO dbo.Ticker(symbol, handelsdatum , pris) VÄRDEN ('STOCK1', '20190212', 150,00), ('STOCK1', '20190213', 151,00), ('STOCK1', '20190214', 148,00), ('STOCK1', '025019', '0250.00 ), ('STOCK1', '20190218', 142,00), ('STOCK1', '20190219', 144,00), ('STOCK1', '20190220', 152,00), ('STOCK1', '201'009, 2201'009.), ('STOCK1', '20190222', 153,00), ('STOCK1', '20190225', 154,00), ('STOCK1', '20190226', 154,00), ('STOCK1', '200',152', '200', 02', '200', 02'. STOCK1', '20190228', 153,00), ('STOCK1', '20190301', 145,00), ('STOCK1', '20190304', 140,00), ('STOCK1', '20190305'0,'0,0305'0,'0,'05'05'0), , '20190306', 143,00), ('STOCK1', '20190307', 142,00), ('STOCK1', '20190308', 140,00), ('STOCK1', '20190311', '20190381', 0,', 'STOCKTO', '0,' 20190212', 330,00), ('STOCK2', '20190213', 329,00), ('STOCK2', '20190214', 329,00), ('STOCK2', '20190215', 326,00), ('STOCK2', '20190218', 325,00), ('STOCK2', '20190219', 326,00), ('20190219', 326,00), ('20190218',0202,'02) , ('STOCK2', '20190221', 326,00), ('STOCK2', '20190222', 320,00), ('STOCK2', '20190225', 317,00), ('STOCK2', '26'009.), '291'009. 'STOCK2', '20190227', 325.00), ('STOCK2', '20190228', 322.00), ('STOCK2', '20190301', 324.00), ('STOCK2', '20190228'0, 3204STO'0), (3204STO'0), (3204S ', '20190305', 319.00), ('STOCK2', '20190306', 322.00), ('STOCK2', '20190307', 326.00), ('STOCK2', '20190308', 20190308', 32,'STOCKS. '20190311', 324,00); VÄLJ symbol, handelsdatum, pris FRÅN dbo.Ticker;

Denna kod genererar följande utdata:

symbol handelsdatum pris------ ---------- ------ STOCK1 2019-02-12 150,00STOCK1 2019-02-13 151,00STOCK1 2019-02-14 148,00LAGER1 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 2019999999 -02-26 154.00stock1 2019-02-27 154.00stock1 2019-02-28 153.00stock1 2019-03-01 145.00stock1 2019-03-04 140.00stock1 2019-03-05 142.00stock1 2019-03-06 143.00stock1 2019-2 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-15226.00stock2 2019-02 2019-02-14 329.00stock2 2019-02-15226.00stock2 2019-02 2019-02-14 329.00stock2 2019-02-15226.00stock2 2019-02 2019-02-14 329.00stock2 2019-02-15226.00stock2 2019-02 2019-02-14 329.00stock2 2019-02-15226.00stock -18 325.00stock2 2019-02-19 326.00stock2 2019-02-20 328.00stock2 2019-02-21 326.00stock2 2019-02-22 320.00stock2 2019-02-25 317.00stock2 2019-02-02-199.00stock2 2019-02-02-02-02-02-02- 27 325,00LAGER2 2019-02-28 322,00LAGER2 2019-03-01 324,00LAGER2 2019-03-04 321,00LAGER2 2019-03-05 319.00STOCK. 2019-03-06 322.00STOCK2 2019-03-07 326.00STOCK2 2019-03-08 326.00STOCK2 2019-03-11 324.0040 rad(er) påverkas.

Följande fråga identifierar mönster som representerar V-former i aktiekursen (en period med strikt fallande kurs följt av en period med strikt stigande pris), med EN RAD PER MATCH som radmönsterrader per match alternativ:

VÄLJ 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 handelsdatum MÄTTER MATCH_NUMBER() AS matchnum, A.tradedate AS startdatum, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B.price) AS bottomprice, LAST(C.tradedate) AS slutdatum, -- samma som LAST(handelsdatum) LAST(C.pris) SOM slutpris, MAX(U.pris) SOM maxpris -- samma som MAX(pris) EN RADD PER MATCH -- standard EFTER MATCH HOPPA FÖRE SISTA RADEN -- standardmönster (A B+ C+ ) SUBSET U =(A, B, C) DEFINE -- A är som standard Sann, matchar valfri rad, samma som att uttryckligen definiera A AS 1 =1 B AS B.price  PREV(C.price) ) AS MR;

PARTITION BY-satsen definierar att du vill hantera varje aktiesymbol separat.

ORDER BY-klausulen definierar beställning baserat på handelsdatum.

DEFINE-satsen definierar radmönstervariabler som representerar de olika undersekvenserna av rader i mönstret. I exemplet ovan representerar A vilken rad som helst som utgångspunkt, B representerar en undersekvens av sjunkande priser (B.price PREV( C.price)).

PATTERN-satsen använder reguljära uttryck för att identifiera ett mönster. I ovanstående fråga är mönstret (A B+ C+), vilket betyder (valfri rad, följt av en eller flera rader med sjunkande priser, följt av en eller flera rader med stigande priser). Följande är kvantifierare för reguljära uttrycksmönster som du kan använda:

* — noll (0) eller fler matchningar+ — en (1) eller fler matchningar? — ingen matchning eller en (1) matchning, valfri{ n } — exakt n matchningar{ n, } — n eller fler matchningar{ n, m } — mellan n och m (inklusive) matchningar{ , m } — mellan noll (0) ) och m (inklusive) matchar{- Variabel -}, t.ex. {- A -} — indikerar att matchande rader ska exkluderas från utdata (endast användbart om ALLA RADER PER MATCH anges)|, t.ex. A | B — alternation(), t.ex. (A | B) — gruppering^, t.ex. ^A{1, 3} — början på en radmönsterpartition$, t.ex. A{1, 3}$ — slutet av ett radmönster partition 

Som standard är kvantifierarna giriga, men du kan definiera dem som motvilliga.

SUBSET-satsen låter dig definiera en namngiven delmängdslista med variabler.

MEASURES-satsen definierar mått relaterade till mönstret. Du kan tillämpa beräkningar på mönstervariabler och på delmängder. Funktionen MATCH_NUMBER() tilldelar sekventiella heltal som börjar med 1 för matchningarna inom partitionen. Du kan använda operationer som FIRST, LAST, PREV och NEXT, såväl som aggregerade beräkningar.

Den här frågan använder EN RAD PER MATCH som alternativ för radmönster för rader per matchning. Detta innebär att resultattabellen kommer att ha en rad per mönstermatchning, liknande resultatet av gruppering. Alternativet är ALLA RADER PER MATCH där du vill att detaljraderna ska returneras per mönstermatchning (exempel kommer inom kort).

Den här frågan använder EFTER MATCH HOPPA FÖRE SISTA RADEN som EFTER MATCH . Det betyder att när en matchning väl hittats vill du att nästa försök ska börja efter sista raden i den aktuella matchen. Det finns andra alternativ som att leta efter nästa matchning i raden efter den första raden i den aktuella matchningen (HOPPA TILL NÄSTA RAD), eller att hoppa till en position i förhållande till en radmönstervariabel.

Här är det förväntade resultatet av den här frågan:

symbol matchnum startdatum startpris bottendat bottenpris slutdatum slutpris maxpris------ -------- ---------- ---------- ---- ------ ----------- ---------- ------------------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 -02-20 328.00 329.00stock2 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  

Här är en något modifierad version av frågan med alternativet ALLA RADER PER MATCH:

VÄLJ 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. pris) SOM bottenpris, SISTA(C.handelsdatum) SOM slutdatum, SISTA(C.pris) SOM slutpris, MAX(U.pris) SOM maxpris ALLA RADER PER MATCH EFTER MATCH HOPPA FÖRE SISTA RADEN MÖNSTER (A B+ C+) SUBSET U =(A, B, C) DEFINIERA B AS B.price  PREV(C.price) ) AS MR;

Här är det förväntade resultatet av den här frågan:

symbol handelsdatum pris matchnum stilig startdatum startpris bottendatum bottenpris slutdatum slutpris maxpris------ ---------- ------ -------- ----- ---------- ---------- ---------- -------------------------- -- ---------- --------LAGER1 2019-02-13 151,00 1 A 2019-02-13 151,00 NULL NULL NULL NULL 151,00LAGER1 2019-02-14 148,00 1 B 2019 02-13 151.00 2019-02-14 148.00 NULL 151.00stock1 2019-02-15 146.00 1 B 2019-02-13 151.00 2019-02-15 146.00 NULL 151.00stock1 2019-02-18 142.00 1 B 2019-02-02- 13 151.00 2019-02-18 142.00 NULL NULL 151.00STOCK1 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-2 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.00STOCK1 2019-02-28 153.00 2 B 2019-02-27 154.00 2019-02-28 153.00 NULL NULL 154.00STOCK1 2019-03-01 145.00 2 B 2019 -02-27 154.00 2019-03-01 145.00 NULL NULL 154.00STOCK1 2019-03-04 140.00 2 B 2019-02-27 154.00 2019-03-04 140.00 NULL 154.00STOCK1 2019-03-05 142.00 2 C 2019-02 -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-03-06 143.00 154.00STOCK2 2019-02-14 329,00 1 A 2019-02-14 329,00 NULL NULL NULL NULL 329,00LAGER2 2019-02-15 326,00 1 B 2019-02-14 329,00 2019-3020 2019-3020 2019-3020 2019-3020 2019-3020 2019-302-2019-2019-2019-2019. 2019-02-14 329.00 2019-02-18 325.00 NULL NULL 329.00STOCK2 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-20 328.00 1 C 2019-02-14 329.00 2019-02-18 325.00 2019-02-20 328.00 329.00stock2 2019-02-21 326.00 2 A 2019-02-21 326.00 NULL NULL NULL NULL 326.00Stock2 2019-02-0222222222-21 B 2019-02-21 326.00 2019-02-22 320.00 NULL NULL 326.00STOCK2 2019-02-25 317.00 2 B 2019-02-21 326.00 2019-02-25 317.00 NULL NULL 326.00STOCK2 2019-02-26 319.00 2 C 2019- 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.00STOCK2 2019-03-04 321.00 3 B 2019-03-01 324.00 2019-03-04 321.00 NULL 324.00STOCK2 2019-03-05 319.00 3 B 2019-03-03-01 324.00 2019-03-03-03-05-05-05-05-03 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 2019-03 2019-03 -05 319,00 2019-03-07 326,00 326,0027 rad(er) påverkas.

Lägg märke till tillägget av måttet classy baserat på funktionen CLASSIFIER. Den här funktionen returnerar en sträng som representerar den radmönstervariabel som resultatraden är associerad med (i vårt fall A, B eller C).

Funktion R020, "Radmönsterigenkänning:WINDOW-sats"

Funktionen R020 använder radmönsterigenkänning som en del av fönstersatsen OVER (eller WINDOW-satsen när man namnger en fönsterspecifikation) för att ytterligare begränsa en fönsterram. Precis som fönsterpartitionen begränsar raderna i inmatningstabelluttrycket (FROM... WHERE... GROUP BY... HAVING), och fönsterramen ytterligare begränsar fönsterpartitionen, med funktionen R020 begränsar du ytterligare hela fönsterramen till en reducerad fönsterram. av efterföljande rader som utgör mönstermatchningen. Här är en fråga som visar den här funktionen med WINDOW-satsen, med liknande radmönster som matchar den som användes i den första frågan i den här artikeln:

VÄLJ T.symbol, T.handelsdatum, T.pris, startdatum ÖVER W, startpris ÖVER W, bottendatum ÖVER W, bottenpris ÖVER W, slutdatum ÖVER W, slutpris ÖVER W, maxpris ÖVER WFRÅN dbo.Ticker TWINDOW W AS ( PARTITION EFTER symbol ORDER EFTER handelsdatum ÅTGÄRDER A.tradedate AS startdatum, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B.price) AS bottomprice, LAST(C.tradedate) AS slutdatum, LAST(C. pris) SOM slutpris, MAX(U.pris) SOM maxpris RADER MELLAN AKTUELL RADER OCH OBEGRÄNSAD FÖLJANDE EFTER MATCH HOPPA FÖRE FÖRSTA RADEN INITIAL -- mönstret måste börja på första raden av hel fönsterram; alternativet är SÖKMÖNSTER (A B+ C+) DELSET U =(A, B, C) DEFINIERA B AS B.price  PREV(C.price) );

När du använder radmönsterigenkänning med fönster, måste hela fönsterramen börja på den aktuella raden. Lägg märke till användningen av alternativet INITIAL i den här frågan. Detta alternativ innebär att du får en matchning endast om mönstret börjar med den aktuella raden. Alternativet är SEEK, vilket innebär att en sökning efter en matchning börjar med den aktuella raden, men tillåts fram till slutet av hela fönsterramen. Hur som helst, om en matchning hittas, består den reducerade fönsterramen endast av mönstermatchningsraderna, annars är den reducerade fönsterramen tom. Endast en radmönstermatchning per hel fönsterram söks.

Observera i frågans SELECT-lista att du kan returnera mått definierade i MEASURES-satsen, beräknade över W, som är den reducerade fönsterramen.

Kom ihåg resultatet av den första frågan i den här artikeln, med hjälp av radmönsterigenkänning i FROM-satsen, med alternativet EN RAD PER MATCH:

symbol matchnum startdatum startpris bottendat bottenpris slutdatum slutpris maxpris------ -------- ---------- ---------- ---- ------ ----------- ---------- ------------------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 -02-20 328.00 329.00stock2 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  

Här är det förväntade resultatet av vår senaste fråga, med hjälp av radmönsterigenkänning i WINDOW-satsen:

symbol handelsdatum pris startdatum startpris bottendatum bottenpris slutpris slutpris maxpris------ ---------- ------ ---------- ----- ----- ---------- ----------- ------------------ ------ -Stock1 2019-02-12 150.00 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 2019-02-14 148.00 Null NULL NULL NULL NULL NULLSTOCK1 2019-02-15 146.00 NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-18 142.00 NULL NULL NULL NULLSTOCK1 2019-02-19 144.00 NULL NULL NULL NULL NULLSTOCK1 2019-02-20-202-202 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 2019- 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 NULLSTOCK1 2019-03-01 145.00 NULL NULL NULL NULL NULLSTOCK1 2019-03-04444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444 14444444444444444444444444444 NULLA AV 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 1201 NUL 1201 Ull NULL NULL NULLSTOCK1 2019-03-08 140.00 NULL NULL NULL NULL NULLSTOCK1 2019-03-11 138.00 NULL NULL NULL NULLStOCK2 2019-02-12 330.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-1339.009.00 NULL NULL NULL NULL NULL NULLS NULL2 2019-029-139.009.00 NULL NULL NULL NULL NULL NULLSTOCK2 2019-029-139.009.00 NULL NULL NULL NULL NULL NULLS NULL2 2019-029-139.00 NULL Null NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-14 329.00 2019-02-14 329.00 2019-02-18 325.00 2019-02-20 328.00 329.00STOCK2 2019-02-15 326.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-18 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 NULLSTOCK2 2019-02-21326.00 2019-02-2-2-236.00 2 326.00 2 019-02-25 317.00 2019-02-27 325.00 326.00stock2 2019-02-22 320.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULLA 2019-02-02-1619.00 NULL NULL NULL NULL NULL NULL 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 319.00 2019-03 -07 326.00 326.00STOCK2 2019-03-04 321.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-05 319.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-06 322.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-07 326.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-08 326.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-03-11 324.00 NULL NULL NULL NULL NULL NULL 40 påverkas. 

Observera att du får alla detaljerade rader i utgången, och där en mönstermatchning startar får du resultatet av de begärda radmönstermåtten mot den reducerade fönsterramen.

Lägg din röst

Det är helt underförstått att för Microsoft att lägga till en funktion till T-SQL - särskilt en sådan betydande - är en ganska betydande investering. Men det som är bra med funktioner som läggs till i T-SQL är att de i stort sett stannar där för alltid. Det finns ett stort community som är sugen på T-SQL-förbättringar som den här.

Om du känner att radmönsterigenkänning är ett viktigt tillägg till SQL Server, se till att du lägger din röst. Dessutom är det mer sannolikt att Microsoft prioriterar en föreslagen funktion om de känner till kunder och använder fall som skulle kunna dra nytta av det, och att sådana kunder för närvarande antingen använder andra produkter eller mer komplexa lösningar. Om du eller dina kunder ser RPR som fördelaktigt för dig och har användningsfall som du kan dela, se till att du lägger till kommentarer till feedbackobjektet och låter Microsoft veta det.


  1. Hur Access 2019 fungerar och hur du arbetar med det

  2. Hur kan jag göra tre tabell JOINs i en UPDATE-fråga?

  3. Skapa en webbapp från grunden med Python Flask och MySQL:Del 3

  4. Varför tar Microsoft SQL Server 2012-frågan några minuter över JDBC 4.0 men sekund(er) i Management Studio?