Database
 sql >> Database >  >> RDS >> Database

Riconoscimento del modello di riga in SQL

Lo standard ISO/IEC 9075:2016, o in breve SQL:2016, introduce il supporto per un concetto profondo chiamato Row Pattern Recognition (RPR) in SQL. Ho pubblicato un suggerimento per migliorare SQL Server aggiungendo il supporto per RPR in T-SQL, ma ero piuttosto limitato nello spazio che avevo per fornire il feedback. Lo scopo di questo articolo è fornire maggiori dettagli sulla proposta e, si spera, sarai convinto della sua importanza e aggiungerai il tuo voto.

Sfondo

Analogamente all'utilizzo di espressioni regolari per identificare i modelli in una stringa, con RPR si utilizzano le espressioni regolari per identificare i modelli in una sequenza di righe. Per ogni corrispondenza del modello, puoi restituire una riga di riepilogo come nel raggruppamento o le righe dettagliate, con misure calcolate rispetto alle sottosequenze della corrispondenza. RPR ha applicazioni pratiche illimitate, tra cui l'identificazione di modelli nell'attività del mercato azionario (sia modelli validi con valore commerciale, sia modelli potenzialmente illegali o sospetti), gestione di serie temporali, rilevamento di frodi, movimentazione di materiali, applicazioni di spedizione, sequenziamento del DNA, lacune e isole, top N per gruppo e molti altri.

Per me, RPR è il passo successivo nell'evoluzione delle funzioni della finestra, con un livello più elevato di sofisticazione e utilità estesa. Se ritieni che le funzioni della finestra siano profonde e utili, RPR ti farà davvero cuocere la pasta. Simile alle funzioni della finestra, RPR supporta il partizionamento e l'ordinamento. In genere cercherai le corrispondenze dei modelli all'interno di ciascuna partizione in modo indipendente, in base all'ordine indicato. Simile anche alle funzioni della finestra, RPR si presta a una buona ottimizzazione, con la possibilità di fare affidamento sull'ordinamento degli indici per evitare l'ordinamento dei dati.

Puoi trovare la copertura di RPR, inclusi esempi illustrati, in una relazione tecnica di 90 pagine ISO/IEC TR 19075-5 (disponibile gratuitamente).

Puoi anche trovarlo come parte del documento ISO/IEC 9075-2:2016, Information technology — Database languages ​​— SQL — Part 2:Foundation (SQL/Foundation) (disponibile per l'acquisto).

Lo standard SQL:2016 fornisce due funzionalità principali relative a RPR:

  • Funzione R010, "Riconoscimento del modello di riga:clausola FROM"
  • Funzione R020, "Riconoscimento del modello di riga:clausola WINDOW"

Lo standard menziona anche la caratteristica R030, "Riconoscimento del modello di riga:supporto aggregato completo", senza la quale le funzioni aggregate non sono autorizzate a specificare DISTINCT o .

Finora, l'unica piattaforma che conosco di quella funzionalità implementata R010 è Oracle. Non conosco ancora nessuna piattaforma che abbia implementato R020.

Funzione R010, "Riconoscimento del modello di riga:clausola FROM"

La funzione R010 definisce una clausola/operatore di tabella denominato MATCH_RECOGNIZE, che viene utilizzato nella clausola FROM. L'input è una tabella o un'espressione di tabella e l'output è una tabella virtuale. Il contesto è simile a quello di altri operatori di tabella come JOIN, APPLY, PIVOT e UNPIVOT. Ecco la sintassi di una query che utilizza questa funzione:

SELECT  DA  MATCH_RICOGNIZE ( [ PARTITION BY  ] [ ORDER BY  ] [ MISURE  ] [  ::=UNA RIGA PER PARTITA | TUTTE LE RIGA PER PARTITA ] [ DOPO LA PARTITA  PATTERN (  ) [ SUBSET  ] DEFINE  ) AS ;

A titolo di esempio adattato dalla suddetta relazione tecnica, supponiamo di ricevere una tabella dbo.Ticker, con colonne simbolo, data di negoziazione e prezzo. Utilizzare il codice seguente per creare la tabella, popolarla con alcuni dati di esempio ed eseguirne una query:

SET NOCOUNT ON; USA tempdb; DROP TABLE SE ESISTE dbo.Ticker; CREATE TABLE dbo.Ticker(simbolo VARCHAR(10) NOT NULL, tradedate DATE NOT NULL, price NUMERIC(12, 2) NOT NULL, CONSTRAINT PK_Ticker PRIMARY KEY (simbolo, tradedate));VAI INSERT INTO dbo.Ticker(simbolo, tradedate , prezzo) VALORI ('STOCK1', '20190212', 150,00), ('STOCK1', '20190213', 151,00), ('STOCK1', '20190214', 148,00), ('STOCK1', '20190215', 146,00 ), ('STOCK1', '20190218', 142.00), ('STOCK1', '20190219', 144.00), ('STOCK1', '20190220', 152.00), ('STOCK1', '20190221', 152.00), ('STOCK1', '20190222', 153.00), ('STOCK1', '20190225', 154.00), ('STOCK1', '20190226', 154.00), ('STOCK1', '20190227', 154.00), (' STOCK1', '20190228', 153,00), ('STOCK1', '20190301', 145,00), ('STOCK1', '20190304', 140,00), ('STOCK1', '20190305', 142,00), ('STOCK1' , '20190306', 143.00), ('STOCK1', '20190307', 142.00), ('STOCK1', '20190308', 140.00), ('STOCK1', '20190311', 138.00), ('STOCK2', ' 20190212', 330.00), ('STOCK2', '20190213', 329.00), ('STOCK2', '20190214', 329.00), ('STOCK2', '20190215', 326.00), ('STOCK2', '20190218', 325.00), ('STOCK2', '20190219', 326.00), ('STOCK2', '20190220', 328.00) , ('STOCK2', '20190221', 326.00), ('STOCK2', '20190222', 320.00), ('STOCK2', '20190225', 317.00), ('STOCK2', '20190226', 319.00), ( 'STOCK2', '20190227', 325.00), ('STOCK2', '20190228', 322.00), ('STOCK2', '20190301', 324.00), ('STOCK2', '20190304', 321.00), ('STOCK2 ', '20190305', 319.00), ('STOCK2', '20190306', 322.00), ('STOCK2', '20190307', 326.00), ('STOCK2', '20190308', 326.00), ('STOCK2', '20190311', 324,00); SELECT simbolo, data commerciale, prezzo DA dbo.Ticker;

Questo codice genera il seguente output:

simbolo prezzo di negoziazione------ ---------- ------ STOCK1 2019-02-12 150.00STOCK1 2019-02-13 151.00STOCK1 2019-02-14 148.00STOCK1 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 -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-093 2019-014 2019 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-02 -18 325.00STOCK2 2019-02-19 326.00STOCK2 2019-02-20 328.00STOCK2 2019-02-21 326.00STOCK2 22-02-2019 320.00STOCK2 25-02-2019 317.00STOCK2 2019-01-02-02-02-206-2 27 325.00STOCK2 2019-02-28 322.00STOCK2 2019-03-01 324.00STOCK2 2019-03-04 321.00STOCK2 2019-03-05 319.00STOCK2 2019-03-06 322.00STOCK2 2019-03-07 326.00STOCK2 2019-03-08 326.00STOCK2 2019-03-11 324.0040 righe interessate.

La query seguente identifica i modelli che rappresentano le forme a V nel prezzo delle azioni (un periodo con prezzo rigorosamente in calo seguito da un periodo con prezzo rigorosamente in aumento), utilizzando UNA RIGA PER MATCH come righe del modello di riga per corrispondenza opzione:

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, -- come LAST(data commerciale) LAST(prezzo C) AS prezzo finale, MAX(prezzo U) AS prezzo massimo -- uguale a MAX(prezzo) UNA RIGA PER PARTITA -- impostazione predefinita DOPO LA PARTITA SALTA PASSATO L'ULTIMA RIGA -- SCHEMA predefinito (A B+ C+ ) SUBSET U =(A, B, C) DEFINE -- A predefinito è True, corrisponde a qualsiasi riga, come definisce esplicitamente A AS 1 =1 B AS B.price  PREV(C.prezzo) ) COME MR;

La clausola PARTITION BY definisce che vuoi gestire ogni simbolo di borsa separatamente.

La clausola ORDER BY definisce l'ordine in base alla data di negoziazione.

La clausola DEFINE definisce le variabili del modello di riga che rappresentano le diverse sottosequenze di righe nel modello. Nell'esempio precedente A rappresenta qualsiasi riga come punto di partenza, B rappresenta una sottosequenza di prezzi decrescenti (B.prezzo PREV( C.prezzo)).

La clausola PATTERN utilizza espressioni regolari per identificare un modello. Nella query precedente il pattern è (A B+ C+), che significa (qualsiasi riga, seguita da una o più righe con prezzi decrescenti, seguite da una o più righe con prezzi crescenti). Di seguito sono riportati i quantificatori di pattern di espressioni regolari che puoi utilizzare:

* — zero (0) o più corrispondenze+ — una (1) o più corrispondenze? — nessuna corrispondenza o una (1) corrispondenza, facoltativa{ n } — esattamente n corrispondenze{ n, } — n o più corrispondenze{ n, m } — tra n e m (incluse) corrispondenze{ , m } — tra zero (0 ) e m (incluso) corrisponde a{- Variabile -}, ad es. {- A -} — indica che le righe corrispondenti devono essere escluse dall'output (utile solo se specificata TUTTA LA RIGA PER MATCH)|, ad es. A | B — alternanza(), ad es. (A | B) — raggruppamento^, ad es. ^A{1, 3} — inizio di un modello di riga partizione$, ad es. A{1, 3}$ — fine di un modello di riga partizione 

Per impostazione predefinita, i quantificatori sono avidi, ma puoi definirli riluttanti.

La clausola SUBSET consente di definire un elenco di sottoinsiemi denominato di variabili.

La clausola MEASURES definisce le misure relative al pattern. È possibile applicare i calcoli alle variabili di pattern e ai sottoinsiemi. La funzione MATCH_NUMBER() assegna numeri interi sequenziali che iniziano con 1 per le corrispondenze all'interno della partizione. Puoi utilizzare operazioni come FIRST, LAST, PREV e NEXT, nonché calcoli aggregati.

Questa query utilizza UNA RIGA PER PARTITA come opzione di righe per corrispondenza del modello di riga. Ciò significa che la tabella dei risultati avrà una riga per corrispondenza del modello, in modo simile al risultato del raggruppamento. L'alternativa è TUTTE LE RIGHE PER PARTITA dove vuoi che le righe dei dettagli vengano restituite per corrispondenza del modello (esempio da seguire a breve).

Questa query utilizza AFTER MATCH SALTA PASSATO ULTIMA RIGA come AFTER MATCH . Ciò significa che una volta trovata una corrispondenza, si desidera che il prossimo tentativo inizi dopo l'ultima riga della corrispondenza corrente. Esistono altre alternative come cercare la corrispondenza successiva nella riga successiva alla prima riga della corrispondenza corrente (SALTA ALLA RIGA SUCCESSIVA) o passare a una posizione relativa a una variabile del modello di riga.

Ecco l'output previsto di questa query:

symbol matchnum data di inizio prezzo di inizio prezzo di fondodata di fine prezzo di fine prezzo massimo------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------STOCK1 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 -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  

Ecco una versione leggermente modificata della query che utilizza l'opzione TUTTE LE RIGHE PER PARTITA:

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. prezzo) AS bottomprice, LAST(C.tradedate) AS enddate, LAST(C.price) AS endprice, MAX(U.price) AS maxprice TUTTE LE RIGHE PER PARTITA DOPO LA PARTITA SALTA PASSATO ULTIMA RIGA PATTERN (A B+ C+) SUBSET U =(A, B, C) DEFINE B AS B.prezzo  PREV(C.prezzo) ) AS MR;

Ecco l'output previsto di questa query:

symbol tradedate prezzo 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 NULLO NULLO 151.00STOCK1 2019-02-15 146.00 1 B 2019-02-13 151.00 2019-02-15 146.00 NULL NULL 151.00STOCK1 2019-02-01 14-02-1 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- 02-13 151.00 2019-02-18 142.00 2019-02-20 152.00 152.00STOCK1 2019-02 -27 154.00 2 A 27-02-2019 154.00 NULLO NULLO NULLO 154.00STOCK1 28-02-2019 153.00 2 B 27-02-2019 154.00 28-02-2019 153.00 NULL NULL 154.00STOCK1 09 2019-1 09 2019-1 -02-27 154.00 2019-03-01 145.00 NULLO NULLO 154.00STOCK1 2019-03-04 140.00 2 B 2019-02-27 154.00 2019-03-04 140.00 NULL NULL 154.00STOCK1 2019-01 2-03-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 B 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 B 21-02-2019 326.00 22-02-2019 320.00 NULLO NULL 326.00STOCK2 25-02-2019 317.00 2 B 21-02-2019 326.00 25-02-2019 317.00 NULL NULL 326.00STOCK2-09-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 NULL 324.00STOCK2 2019-03-05 319.00 3 B 2019-03-01 32 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 righe interessate.

Si noti l'aggiunta della misura classy basata sulla funzione CLASSIFICATORE. Questa funzione restituisce una stringa che rappresenta la variabile del modello di riga a cui è associata la riga del risultato (nel nostro caso, A, B o C).

Funzione R020, "Riconoscimento del modello di riga:clausola WINDOW"

La funzione R020 utilizza il riconoscimento del modello di riga come parte della clausola OVER di finestra (o clausola WINDOW quando si nomina una specifica di finestra) per limitare ulteriormente una cornice di finestra. Proprio come la partizione della finestra restringe le righe dell'espressione della tabella di input (DA... DOVE... GROUP BY... HAVING), e la cornice della finestra restringe ulteriormente la partizione della finestra, con la funzione R020 si limita ulteriormente la cornice della finestra intera a una cornice della finestra ridotta creata della sottosequenza di righe che costituiscono il pattern match. Ecco una query che dimostra questa funzionalità con la clausola WINDOW, utilizzando una specifica di corrispondenza del modello di riga simile a quella utilizzata nella prima query in questo articolo:

SELECT T.symbol, T.tradedate, T.prezzo, data di inizio OVER W, prezzo di partenza OVER W, data di fine OVER W, prezzo inferiore OVER W, data di fine OVER W, prezzo finale OVER W, prezzo max OVER WFROM dbo.Ticker TWINDOW W AS ( PARTIZIONE PER simbolo ORDINE PER data di negoziazione MISURE 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. prezzo) AS prezzo finale, MAX(U.price) AS maxprice RIGHE TRA LA RIGA ATTUALE E UNBOUNDED SEGUENTI DOPO LA PARTITA SALTA PASSATO ULTIMA RIGA INIZIALE -- il pattern deve iniziare dalla prima riga dell'intero telaio della finestra; l'alternativa è SEEK PATTERN (A B+ C+) SUBSET U =(A, B, C) DEFINE B AS B.prezzo  PREV(C.prezzo) );

Quando si utilizza il riconoscimento del modello di riga con la finestratura, l'intera cornice della finestra deve iniziare dalla riga corrente. Notare l'uso dell'opzione INITIAL in questa query. Questa opzione significa che ottieni una corrispondenza solo se il modello inizia con la riga corrente. L'alternativa è SEEK, il che significa che la ricerca di una corrispondenza inizia con la riga corrente, ma è consentita fino alla fine dell'intero riquadro della finestra. In ogni caso, se viene trovata una corrispondenza, la cornice della finestra ridotta è costituita solo dalle righe di corrispondenza del modello, altrimenti la cornice della finestra ridotta è vuota. Viene ricercata solo una corrispondenza del modello di riga per cornice della finestra intera.

Osservare nell'elenco SELECT della query che è possibile restituire misure definite nella clausola MEASURES, calcolate su W, che è il frame ridotto della finestra.

Richiama il risultato della prima query in questo articolo, utilizzando il riconoscimento del modello di riga nella clausola FROM, con l'opzione ONE ROW PER MATCH:

symbol matchnum data di inizio prezzo di inizio prezzo di fondodata di fine prezzo di fine prezzo massimo------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------STOCK1 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 -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  

Ecco l'output previsto della nostra ultima query, utilizzando il riconoscimento del modello di riga nella clausola WINDOW:

simbolo data di negoziazione prezzo data di inizio prezzo di inizio data di fine prezzo di fine prezzo di fine prezzo massimo------ ---------- ------ ---------- ----- ----- ---------- ----------- ---------- -------- ------ --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.00STOCK10201 N.4 2019 NULL NULL NULL NULL NULLSTOCK1 2019-02-15 146.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-18 142.00 NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-19 144.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-0 152 NULL NULL NULL NULL NULL NULL NULLSTOCK1 21-02-2019 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 2019-02-27 2019-02-27 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 NULLSTOCK1 2019-03-01 145.00 NULL NULL NULL NULL-30 09 09 401 NULLST 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 NULLSTOCK1 2019-03-07 142.00 NULL NULL NULL N ULL NULL NULL NULLSTOCK1 2019-03-08 140.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-03-11 138.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-12 330.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-1 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-02-STOCK NULL2 NULL-02-STOCK NULL2 325.00 NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-19 326.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-20 328.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-21 326.00 2019-02-0 32 019-02-25 317.00 2019-02-27 325.00 326.00STOCK2 2019-02-22 320.00 NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-25 317.00 NULL NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019 02-03 NULL026 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 2019-03-02 -07. NULLO 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 NULL40 righe interessate.

Osserva che ottieni tutte le righe dettagliate nell'output e, quando inizia una corrispondenza del modello, ottieni il risultato delle misure del modello di riga richieste rispetto alla cornice della finestra ridotta.

Esprimi il tuo voto

È perfettamente chiaro che per Microsoft aggiungere una funzionalità a T-SQL, in particolare una così sostanziale, è un investimento piuttosto significativo. Ma la cosa fantastica delle funzionalità aggiunte a T-SQL è che rimangono praticamente lì per sempre. C'è un'enorme comunità affamata di miglioramenti T-SQL come questo.

Se ritieni che il riconoscimento del modello di riga sia un'aggiunta importante a SQL Server, assicurati di esprimere il tuo voto. Inoltre, è più probabile che Microsoft dia la priorità a una funzionalità proposta se è a conoscenza di clienti e casi d'uso che potrebbero trarne vantaggio e che al momento tali clienti utilizzano altri prodotti o soluzioni più complesse. Se tu o i tuoi clienti vedete l'RPR come vantaggioso per voi e avete casi d'uso che potete condividere, assicuratevi di aggiungere commenti all'elemento di feedback e informate Microsoft.