Database
 sql >> Base de Dados >  >> RDS >> Database

Reconhecimento de padrão de linha em SQL


O padrão ISO/IEC 9075:2016, ou SQL:2016 em resumo, apresenta suporte para um conceito profundo chamado Row Pattern Recognition (RPR) em SQL. Publiquei uma sugestão para melhorar o SQL Server adicionando suporte para RPR no T-SQL, mas estava bastante limitado no espaço que tinha para fornecer o feedback. O objetivo deste artigo é fornecer mais detalhes sobre a proposta, e esperamos que você se convença de sua importância e adicione seu voto.

Plano de fundo


Semelhante ao uso de expressões regulares para identificar padrões em uma string, com RPR você usa expressões regulares para identificar padrões em uma sequência de linhas. Para cada correspondência de padrão, você pode retornar uma linha de resumo, como no agrupamento, ou as linhas detalhadas, com medidas computadas em relação às subsequências da correspondência. O RPR tem aplicações práticas ilimitadas, incluindo a identificação de padrões na atividade do mercado de ações (tanto padrões válidos com valor comercial quanto padrões potencialmente ilegais ou suspeitos), manipulação de séries temporais, detecção de fraudes, manuseio de materiais, aplicativos de remessa, sequenciamento de DNA, lacunas e ilhas, top N por grupo, e muitos outros.

Para mim, o RPR é o próximo passo na evolução das funções de janela, com um nível mais alto de sofisticação e utilidade estendida. Se você acha que as funções da janela são profundas e úteis, o RPR realmente vai assar seu macarrão. Semelhante às funções de janela, o RPR suporta particionamento e ordenação. Normalmente, você procurará correspondências de padrão dentro de cada partição de forma independente, com base na ordenação indicada. Também semelhante às funções de janela, o RPR se presta a uma boa otimização, com a capacidade de contar com a ordenação do índice para evitar a classificação dos dados.

Você pode encontrar cobertura de RPR, incluindo exemplos ilustrados, em um relatório técnico de 90 páginas ISO/IEC TR 19075-5 (disponível gratuitamente).

Você também pode encontrá-lo como parte do documento ISO/IEC 9075-2:2016, Tecnologia da informação — Linguagens de banco de dados — SQL — Parte 2:Fundação (SQL/Fundação) (disponível para compra).

O padrão SQL:2016 fornece dois recursos principais relacionados ao RPR:
  • Recurso R010, “Reconhecimento de padrão de linha:cláusula FROM”
  • Recurso R020, “Reconhecimento de padrão de linha:cláusula WINDOW”

O padrão também menciona o recurso R030, “Reconhecimento de padrão de linha:suporte total agregado”, sem o qual as funções agregadas não podem especificar DISTINCT ou .

Até agora, a única plataforma que conheço desse recurso implementado R010 é o Oracle. Ainda não conheço nenhuma plataforma que tenha implementado o R020.

Recurso R010, “Reconhecimento de padrão de linha:cláusula FROM”


O recurso R010 define um operador de cláusula/tabela chamado MATCH_RECOGNIZE, que você usa na cláusula FROM. A entrada é uma tabela ou expressão de tabela e a saída é uma tabela virtual. O contexto é semelhante ao de outros operadores de tabela como JOIN, APPLY, PIVOT e UNPIVOT. Aqui está a sintaxe de uma consulta usando esse recurso:
SELECT  FROM  MATCH_RECOGNIZE ( [ PARTITION BY  ] [ ORDER BY  ] [ MEASURES  ] [  ::=UMA LINHA POR PARTIDA | TODAS AS LINHAS POR PARTIDA ] [ AFTER MATCH  PATTERN (  ) [ SUBSET  ] DEFINE  ) AS ;

Como exemplo adaptado do relatório técnico mencionado acima, suponha que você receba uma tabela dbo.Ticker, com colunas símbolo, data de negociação e preço. Use o código a seguir para criar a tabela, preenchê-la com alguns dados de exemplo e consultá-la:
SET NOCOUNT ON; USE tempdb; DROP TABLE SE EXISTE dbo.Ticker; CREATE TABLE dbo.Ticker(símbolo VARCHAR(10) NOT NULL, tradedate DATE NOT NULL, price NUMERIC(12, 2) NOT NULL, CONSTRAINT PK_Ticker PRIMARY KEY (símbolo, tradedate));GO INSERT INTO dbo.Ticker(símbolo, tradedate , preço) VALORES ('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 símbolo, data de negociação, preço FROM dbo.Ticker;

Este código gera a seguinte saída:
preço de data de negociação do símbolo------ ---------- ------ 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 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 2019-03-04 140.00STOCK1 2019-03-05 142.00STOCK1 2019-03-04 03-07 142.00STOCK1 2019-03-08 140.00STOCK11/03/2019 -18 325,00STOCK2 2019-02-19 326,00STOCK2 2019-02-20 328,00STOCK2 21-02-2019 326,00STOCK2 22-02-2019 320,00STOCK2 2019-02-25 317,00STOCK2 2019-02-02-2019-02-02 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 linhas afetadas.

A consulta a seguir identifica padrões que representam formas V no preço da ação (um período com preço estritamente em queda seguido por um período com preço estritamente crescente), usando UMA LINHA POR CORRESPONDÊNCIA como as linhas padrão de linha por correspondência opção:
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 símbolo ORDER BY tradedate MEDIDAS 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, -- igual a LAST(data comercial) LAST(C.price) AS endprice, MAX(U.price) AS maxprice -- igual a MAX(price) UMA LINHA POR JOGO -- padrão APÓS JOGO PULAR LINHA ÚLTIMA -- PADRÃO padrão (A B+ C+ ) SUBSET U =(A, B, C) DEFINE -- A padrão é True, corresponde a qualquer linha, o mesmo que definir explicitamente A AS 1 =1 B AS B.price  PREV(C.price) ) AS MR;

A cláusula PARTITION BY define que você deseja tratar cada símbolo de ações separadamente.

A cláusula ORDER BY define o pedido com base na data de negociação.

A cláusula DEFINE define variáveis ​​de padrão de linha que representam as diferentes subsequências de linhas no padrão. No exemplo acima, A representa qualquer linha como ponto de partida, B representa uma subsequência de preços decrescentes (B.price PREV( C. preço)).

A cláusula PATTERN usa expressões regulares para identificar um padrão. Na consulta acima o padrão é (A B+ C+), ou seja (qualquer linha, seguida por uma ou mais linhas com preços decrescentes, seguidas por uma ou mais linhas com preços crescentes). A seguir estão os quantificadores de padrão de expressão regular que você pode usar:
* — zero (0) ou mais correspondências+ — uma (1) ou mais correspondências? — nenhuma correspondência ou uma (1) correspondência, opcional{ n } — exatamente n correspondências{ n, } — n ou mais correspondências{ n, m } — entre n e m (inclusive) correspondências{ , m } — entre zero (0 ) e m (inclusive) corresponde{- Variável -}, por exemplo, {- A -} — indica que as linhas correspondentes devem ser excluídas da saída (útil somente se ALL ROW PER MATCH especificado)|, por exemplo, A | B — alternância(), por exemplo, (A | B) — agrupamento^, por exemplo, ^A{1, 3} — início de uma partição de padrão de linha$, por exemplo, A{1, 3}$ — fim de um padrão de linha partição 

Por padrão, os quantificadores são gananciosos, mas você pode defini-los como relutantes.

A cláusula SUBSET permite definir uma lista de variáveis ​​de subconjunto nomeado.

A cláusula MEASURES define medidas relacionadas ao padrão. Você pode aplicar cálculos a variáveis ​​de padrão e a subconjuntos. A função MATCH_NUMBER() atribui números inteiros sequenciais começando com 1 para as correspondências dentro da partição. Você pode usar operações como FIRST, LAST, PREV e NEXT, bem como cálculos agregados.

Esta consulta usa ONE ROW PER MATCH como as linhas de padrão de linha por opção de correspondência. Isso significa que a tabela de resultados terá uma linha por correspondência de padrão, semelhante ao resultado do agrupamento. A alternativa é ALL ROWS PER MATCH onde você deseja que as linhas de detalhes sejam retornadas por correspondência de padrão (exemplo a seguir em breve).

Essa consulta usa AFTER MATCH SKIP PAST LAST ROW como AFTER MATCH . Isso significa que, assim que uma correspondência for encontrada, você deseja que a próxima tentativa comece após a última linha da correspondência atual. Existem outras alternativas, como procurar a próxima correspondência na linha após a primeira linha da correspondência atual (SKIP TO NEXT ROW) ou pular para uma posição relativa a uma variável de padrão de linha.

Aqui está a saída esperada desta consulta:
símbolo matchnum startprice startprice bottomdat bottomprice enddate endprice maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------ESTOQUE1 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-02-18 325.00 2019 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 2019-03-05 319.00 2019-03-07 326. pré> 
Aqui está uma versão ligeiramente modificada da consulta usando a opção 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 símbolo ORDER BY tradedate MEDIDAS MATCH_NUMBER() AS matchnum, CLASSIFIER() AS classy, ​​A.tradedate AS startdate, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B. preço) AS preço inferior, ÚLTIMO(C.data de negociação) AS data final, ÚLTIMO(C.preço) AS preço final, MAX(preço U) AS maxprice TODAS AS LINHAS POR JOGO DEPOIS DO JOGO PULAR PADRÃO DA ÚLTIMA LINHA (A B+ C+) SUBCONJUNTO U =(A, B, C) DEFINE B AS B.price  PREV(C.price) ) AS MR;

Aqui está a saída esperada desta consulta:
símbolo tradedate preço matchnum classy startdate startprice bottomdate bottomprice enddate endprice maxprice------ ---------- ------ -------- ----- - ---------- ---------- ---------- ----------- -------- -- --------- -------- ESTOQUE1 13-02-2019 151,00 1 A 13-02-2019 151,00 NULO NULO NULO NULO 151,00 ESTOQUE1 14-02-2019 148,00 1 B 2019- 02-13 151.00 2019-02-14 148,00 NULL NULL 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-18 142.00 1 B 2019-02- 13 151.00 2019-02-18 142.00 NULL NULL 151.00STOCK11/02/2019 02-13 151,00 2019-02-18 142,00 2019-02-20 152,00 152,00STOCK1 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 -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.00stock22-02-14 329,00 1 A 14-02-2019 329,00 NULO NULO NULO 329,00 STOCK2 15-02-2019 326,00 1 B 14-02-2019 329,00 15-02-2019 326,00 NULO NULO 329.000STOCK2 21 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-02 326.00 329.00STOCK2 2019-02 -20 -20 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 326. 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.00.00. 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-03-001 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. -05 319,00 07-03-2019 326,00 326,0027 linhas afetadas.

Observe a adição da medida classy baseada na função CLASSIFIER. Essa função retorna uma string representando a variável de padrão de linha à qual a linha de resultado está associada (no nosso caso, A, B ou C).

Recurso R020, “Reconhecimento de padrão de linha:cláusula WINDOW”


O recurso R020 usa o reconhecimento de padrão de linha como parte da cláusula OVER de janela (ou cláusula WINDOW ao nomear uma especificação de janela) para restringir ainda mais um quadro de janela. Assim como a partição da janela restringe as linhas da expressão da tabela de entrada (FROM… WHERE… GROUP BY… HAVING), e o quadro da janela restringe ainda mais a partição da janela, com o recurso R020 você restringe ainda mais o quadro da janela completo a um quadro de janela reduzido feito da subsequência de linhas que constituem a correspondência de padrões. Aqui está uma consulta demonstrando esse recurso com a cláusula WINDOW, usando uma especificação de correspondência de padrão de linha semelhante à usada na primeira consulta deste artigo:
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 ( PARTIÇÃO POR símbolo ORDER POR data de negociação MEDIDAS A.data de negociação AS data de início, A.preço AS preço de início, ÚLTIMA(B.data de negociação) AS data inferior, ÚLTIMA(Preço B) AS preço inferior, ÚLTIMA(C.data de negociação) AS data final, ÚLTIMA(C. preço) AS endprice, MAX(U.price) AS maxprice LINHAS ENTRE A LINHA ATUAL E ILIMITADA SEGUINDO APÓS PARTIDA PULAR ÚLTIMA LINHA INICIAL -- o padrão deve começar na primeira linha da moldura da janela inteira; alternativa é SEEK PATTERN (A B+ C+) SUBSET U =(A, B, C) DEFINE B AS B.preço  PREV(C.price) );

Ao usar o reconhecimento de padrão de linha com janelas, o quadro de janela completo deve começar na linha atual. Observe o uso da opção INITIAL nesta consulta. Essa opção significa que você obtém uma correspondência apenas se o padrão começar com a linha atual. A alternativa é SEEK, o que significa que uma busca por uma correspondência começa na linha atual, mas é permitida até o final do quadro de janela completo. De qualquer forma, se uma correspondência for encontrada, o quadro de janela reduzido consiste apenas nas linhas de correspondência de padrão, caso contrário, o quadro de janela reduzido estará vazio. Apenas uma correspondência de padrão de linha por moldura de janela completa é procurada.

Observe na lista SELECT da consulta que você pode retornar medidas definidas na cláusula MEASURES, computadas sobre W, que é o frame reduzido da janela.

Lembre-se do resultado da primeira consulta neste artigo, usando o reconhecimento de padrão de linha na cláusula FROM, com a opção ONE ROW PER MATCH:
símbolo matchnum startprice startprice bottomdat bottomprice enddate endprice maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------ESTOQUE1 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-02-18 325.00 2019 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 2019-03-05 319.00 2019-03-07 326. pré> 
Aqui está a saída esperada de nossa última consulta, usando reconhecimento de padrão de linha na cláusula WINDOW:
símbolo data de negociação preço data de início preço inicial preço inferior data final preço final preço final preço máximo------ ---------- ------ ---------- ----- ----- ---------- ----------- ---------- -------- ------ --STOCK11 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-18 148.00 NULL Nulo nulo nulo nulo nulo nullstock1 2019-02-15 146,00 nulo nulo nulo nulo nulo nulo nulo nulo nullstock1 2019-02-18 142.00 nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo NUL1110 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL1019-02-02-19 144. NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-21 152.00 NULL NULL NULL NULL N Ull null nullstock1 2019-02-22 153,00 nulo nulo nulo nulo nulo nulo nulo nullstock1 2019-02-25 154.00 nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo NULL 2019 154 154. 02-27 154.00 2019-03-04 140.00 2019-03-06 143.00 154.00STOCK1 2019-02-28 153.00 nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo 14 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 NULLSTOCK1 NULL NULL NULL-07 142.00 Ull null null nullstock1 2019-03-08 140,00 nulo nulo nulo nulo nulo nulo nulo nulo null110-03-03-11 138,00 nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo 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 219-02-12 330,00 nulo nulo nulo null null2222202-02-12 330,00 Nulo nulo nulo nulo 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 nulo nulo nulo Null Null Null Null Null Null22020202026. 325.00 NULL 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-21 326.00 2 019-02-25 317,00 2019-02-27 325.00 326.00STOCK2 2019-02-22 320,00 NULL nulo nulo nulo nulo nulo nulo nulo nulo nulo nulo NULL NULL NULL NULL 219-02-25 317.00 NULL NULL NULL NULL 319 319.00 319. 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 NULO NULL NULL NULL NULL NULL NULLSTOCK2 08-03-2019 326.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 11-03-2019 324.00 NULL NULL NULL NULL NULL NULL NULL40 linhas afetadas.

Observe que você obtém todas as linhas detalhadas na saída e, onde uma correspondência de padrão é iniciada, obtém o resultado das medidas de padrão de linha solicitadas em relação ao quadro de janela reduzido.

Dê seu voto


É completamente entendido que para a Microsoft adicionar um recurso ao T-SQL - especialmente um tão substancial - é um investimento bastante significativo. Mas o que é ótimo sobre os recursos que são adicionados ao T-SQL é que eles ficam lá para sempre. Há uma enorme comunidade faminta por melhorias no T-SQL como esta.

Se você acha que o reconhecimento de padrão de linha é uma adição importante ao SQL Server, certifique-se de votar. Além disso, é mais provável que a Microsoft priorize um recurso proposto se souber de clientes e casos de uso que possam se beneficiar dele e que, no momento, esses clientes estejam usando outros produtos ou soluções mais complexas. Se você ou seus clientes considerarem o RPR benéfico para você e tiverem casos de uso que possam ser compartilhados, certifique-se de adicionar comentários ao item de feedback e informar a Microsoft.