sql >> Base de Datos >  >> RDS >> Database

Reconocimiento de patrones de fila en SQL

El estándar ISO/IEC 9075:2016, o SQL:2016 en resumen, introduce soporte para un concepto profundo llamado Reconocimiento de patrones de fila (RPR) en SQL. Publiqué una sugerencia para mejorar SQL Server agregando soporte para RPR en T-SQL, pero estaba bastante limitado en el espacio que tenía para proporcionar comentarios. El propósito de este artículo es brindar más detalles sobre la propuesta y, con suerte, se convencerá de su importancia y agregará su voto.

Antecedentes

De manera similar al uso de expresiones regulares para identificar patrones en una cadena, con RPR usa expresiones regulares para identificar patrones en una secuencia de filas. Para cada coincidencia de patrón, puede devolver una fila de resumen como en la agrupación, o las filas detalladas, con medidas calculadas contra las subsecuencias de la coincidencia. RPR tiene aplicaciones prácticas ilimitadas, incluida la identificación de patrones en la actividad del mercado de valores (tanto patrones válidos con valor comercial como patrones potencialmente ilegales o sospechosos), manejo de series temporales, detección de fraude, manejo de materiales, aplicaciones de envío, secuenciación de ADN, brechas e islas, top N por grupo, y muchos otros.

Para mí, RPR es el siguiente paso en la evolución de las funciones de ventana, con un mayor nivel de sofisticación y utilidad extendida. Si crees que las funciones de ventana son profundas y útiles, RPR realmente te va a encantar. Al igual que las funciones de ventana, RPR admite la partición y el ordenamiento. Por lo general, buscará coincidencias de patrones dentro de cada partición de forma independiente, según el orden indicado. También similar a las funciones de ventana, RPR se presta a una buena optimización, con la capacidad de confiar en el ordenamiento de índices para evitar clasificar los datos.

Puede encontrar cobertura de RPR, incluidos ejemplos ilustrados, en un informe técnico de 90 páginas ISO/IEC TR 19075-5 (disponible de forma gratuita).

También puede encontrarlo como parte del documento ISO/IEC 9075-2:2016, Tecnología de la información — Lenguajes de bases de datos — SQL — Parte 2:Foundation (SQL/Foundation) (disponible para la compra).

El estándar SQL:2016 proporciona dos funciones principales relacionadas con RPR:

  • Función R010, "Reconocimiento de patrón de fila:cláusula FROM"
  • Función R020, "Reconocimiento de patrón de fila:cláusula WINDOW"
  • El estándar también menciona la función R030, "Reconocimiento de patrones de filas:compatibilidad completa con agregados", sin la cual las funciones agregadas no pueden especificar DISTINCT o .

    Hasta ahora, la única plataforma que conozco que implementó la característica R010 es Oracle. No conozco ninguna plataforma que haya implementado R020 todavía.

    Función R010, "Reconocimiento de patrón de fila:cláusula FROM"

    La característica R010 define un operador de cláusula/tabla denominado MATCH_RECOGNIZE, que se utiliza en la cláusula FROM. La entrada es una tabla o una expresión de tabla y la salida es una tabla virtual. El contexto es similar al de otros operadores de tablas como JOIN, APPLY, PIVOT y UNPIVOT. Esta es la sintaxis de una consulta que usa esta función:

    SELECT  FROM  MATCH_RECOGNIZE ( [ PARTITION BY  ] [ ORDER BY  ] [ MEASURES  ] [  ::=UNA FILA POR PARTIDO | TODAS LAS FILAS POR PARTIDO ] [ DESPUÉS DEL PARTIDO  PATRÓN (  ) [ SUBCONJUNTO  ] DEFINE  ) COMO ;

    Como ejemplo adaptado del informe técnico mencionado anteriormente, supongamos que se le proporciona una tabla dbo.Ticker, con las columnas símbolo, fecha de negociación y precio. Use el siguiente código para crear la tabla, rellénela con algunos datos de muestra y consúltela:

    CONFIGURAR NOCUENTO EN; UTILIZAR tempdb; DROP TABLE SI EXISTE dbo.Ticker; CREAR TABLA dbo.Ticker( símbolo VARCHAR(10) NO NULO, fecha de negociación FECHA NO NULO, precio NUMÉRICO(12, 2) NO NULO, RESTRICCIÓN PK_Ticker CLAVE PRIMARIA (símbolo, fecha de negociación));IR INSERTAR EN dbo.Ticker(símbolo, fecha de negociación , precio) 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), ('EXISTENCIA2', '20190213', 329,00), ('EXISTENCIA2', '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); SELECCIONE símbolo, fecha de negociación, precio DESDE dbo.Ticker;

    Este código genera el siguiente resultado:

    símbolo precio de fecha de negociación------ ---------- ------ ACCIÓN1 2019-02-12 150.00ACCIÓN1 2019-02-13 151.00ACCIÓN1 2019-02-14 148.00ACCIÓN1 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 3069-03-09 3069-03-09 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 2019-02-22 320.00STOCK2 2019-02-25 317.00STOCK2 2010.206-2019 3929-00 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.00EXISTENCIA2 2019-03-07 326.00EXISTENCIA2 2019-03-08 326.00EXISTENCIA2 2019-03-11 324.0040 fila(s) afectadas.

    La siguiente consulta identifica patrones que representan formas de V en el precio de las acciones (un período con un precio estrictamente descendente seguido de un período con un precio estrictamente creciente), utilizando UNA FILA POR PARTIDO como el patrón de fila filas por coincidencia opción:

    SELECCIONE MR.symbol, MR.matchnum, MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR.maxpriceFROM dbo.Ticker COINCIDIR_RECONOCER (PARTICIÓN POR símbolo ORDEN POR fecha de negociación 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, -- igual que ÚLTIMO(fecha de negociación) ÚLTIMO(C.price) COMO precio final, MAX(U.price) COMO maxprice -- igual que MAX(price) UNA FILA POR PARTIDO -- predeterminado DESPUÉS DEL PARTIDO SALTAR ÚLTIMA FILA -- predeterminado PATRÓN (A B+ C+ ) SUBSET U =(A, B, C) DEFINE -- A por defecto es True, coincide con cualquier fila, lo mismo que definir explícitamente A AS 1 =1 B AS B.price  PREV(C.precio) ) COMO MR;

    La cláusula PARTITION BY define que desea manejar cada símbolo bursátil por separado.

    La cláusula ORDER BY define el pedido en función de la fecha de negociación.

    La cláusula DEFINE define variables de patrón de fila que representan las diferentes subsecuencias de filas en el patrón. En el ejemplo anterior, A representa cualquier fila como punto de partida, B representa una subsecuencia de precios decrecientes (B.price PREV( C.precio)).

    La cláusula PATTERN usa expresiones regulares para identificar un patrón. En la consulta anterior, el patrón es (A B+ C+), lo que significa (cualquier fila, seguida de una o más filas con precios decrecientes, seguida de una o más filas con precios crecientes). Los siguientes son cuantificadores de patrones de expresiones regulares que puede usar:

    * — cero (0) o más coincidencias+ — ¿una (1) o más coincidencias? — ninguna coincidencia o una (1) coincidencia, opcional{ n } — exactamente n coincidencias{ n, } — n o más coincidencias{ n, m } — entre n y m (inclusive) coincidencias{ , m } — entre cero (0 ) y m (inclusive) coincidencias{- Variable -}, p. ej., {- A -}:indica que las filas coincidentes deben excluirse de la salida (útil solo si se especifica TODAS LAS FILAS POR PARTIDA)|, p. ej., A | B — alternancia(), por ejemplo, (A | B) — agrupación^, por ejemplo, ^A{1, 3} — inicio de un patrón de fila partición$, por ejemplo, A{1, 3}$ — final de un patrón de fila partición 

    De forma predeterminada, los cuantificadores son codiciosos, pero puede definirlos para que sean reacios.

    La cláusula SUBSET le permite definir una lista de subconjuntos de variables con nombre.

    La cláusula MEASURES define medidas relacionadas con el patrón. Puede aplicar cálculos a variables de patrones ya subconjuntos. La función MATCH_NUMBER() asigna enteros secuenciales que comienzan con 1 para las coincidencias dentro de la partición. Puede usar operaciones como PRIMERO, ÚLTIMO, ANTERIOR y SIGUIENTE, así como cálculos agregados.

    Esta consulta utiliza UNA FILA POR COINCIDENCIA como patrón de fila filas por opción de coincidencia. Esto significa que la tabla de resultados tendrá una fila por coincidencia de patrón, similar al resultado de la agrupación. La alternativa es TODAS LAS FILAS POR COINCIDENCIA donde desea que se devuelvan las filas detalladas por coincidencia de patrón (ejemplo a continuación).

    Esta consulta utiliza DESPUÉS DEL PARTIDO SALTAR MÁS ALLÁ DE LA ÚLTIMA FILA como DESPUÉS DEL PARTIDO . Esto significa que una vez que se encuentra una coincidencia, desea que el próximo intento comience después de la última fila de la coincidencia actual. Existen otras alternativas, como buscar la siguiente coincidencia en la fila que sigue a la primera fila de la coincidencia actual (SALTAR A LA SIGUIENTE FILA), o saltar a una posición relativa a una variable de patrón de fila.

    Este es el resultado esperado de esta consulta:

    símbolo número de coincidencia fecha de inicio precio de inicio bottomdat precio inferior fecha de finalización precio de finalización maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------EXISTENCIA1 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  

    Aquí hay una versión ligeramente modificada de la consulta usando la opción TODAS LAS FILAS POR PARTIDO:

    SELECCIONE MR.símbolo, MR.fecha comercial, MR.precio, MR.matchnum, MR.con clase, MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR. maxpriceFROM dbo.Ticker COINCIDIR_RECONOCER (PARTICIÓN POR símbolo ORDENAR POR fecha de negociación MEDIDAS MATCH_NUMBER() AS matchnum, CLASSIFIER() AS classy, ​​A.tradedate AS startdate, A.price AS startprice, LAST(B.tradedate) AS bottomdate, LAST(B. precio) AS bottomprice, LAST(C.tradedate) AS enddate, LAST(C.price) AS endprice, MAX(U.price) AS maxprice TODAS LAS FILAS POR PARTIDA DESPUÉS DE LA PARTIDA SALTAR PASADO ÚLTIMA FILA PATRÓN (A B+ C+) SUBCONJUNTO U =(A, B, C) DEFINE B COMO B.precio  PREV(C.precio) ) AS MR;

    Este es el resultado esperado de esta consulta:

    símbolo fecha de negociación precio número de coincidencia con clase fecha de inicio precio de inicio fecha inferior precio inferior fecha final precio final precio máximo------ ---------- ------ -------- ----- - ---------- ---------- ---------- ----------- -------- -- --------- --------EXISTENCIA1 2019-02-13 151.00 1 A 2019-02-13 151.00 NULO NULO NULO NULO 151.00EXISTENCIA1 2019-02-14 148.00 1 B 2019- 13-02 151.00 2019-02-14 148.00 NULO NULO 151.00EXISTENCIA1 2019-02-15 146.00 1 B 2019-02-13 151.00 2019-02-15 146.00 NULO NULO 151.00EXISTENCIA1 2019-10 2-08 142-10 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-02 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.00EXISTENCIA1 2019-02 -27 154.00 2 A 2019-02-27 154.00 NULO NULO NULO NULO 154.00EXISTENCIA1 2019-02-28 153.00 2 B 2019-02-27 154.00 2019-02-28 153.00 NULO NULO 154.00EXISTENCIA1 3-029 10 2 2019-0 -02-27 154.00 2019-03-01 145.00 NULO NULO 154.00EXISTENCIA1 2019-03-04 140.00 2 B 2019-02-27 154.00 2019-03-04 140.00 NULO NULO 154.00EXISTENCIA1 2019 12-02-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-03-06 143.00 154.00Stock2 2019-02-14 329.00 1 A 2019-02-14 329.00 NULO NULO NULO NULO 329.00EXISTENCIA2 2019-02-15 326.00 1 B 2019-02-14 329.00 2019-02-15 326.00 NULO NULO 329.00EXISTENCIA2 2019 102-125 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-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.00EXISTENCIA2 2019-02-21 326.00 2 A 2019-02-21 326.00 NULO NULO NULO NULO 326.00209-2 202-01EXISTENCIA 302 2019-02-21 326.00 2019-02-22 320.00 NULO NULO 326.00EXISTENCIA2 2019-02-25 317.00 2 B 2019-02-21 326.00 2019-02-25 317.00 NULO NULO 326.00EXISTENCIA 2 30 2019-0 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-03- 01 324.00 3 A 2019-03-01 324.0 0 NULL NULL NULL NULL 324.00EXISTENCIA2 2019-03-04 321.00 3 B 2019-03-01 324.00 2019-03-04 321.00 NULL NULL 324.00EXISTENCIA2 2019-03-05 319.00 3 B 2019-03-05-01 324.00 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 fila(s) afectadas.

    Observe la adición de la medida con clase basada en la función CLASIFICADOR. Esta función devuelve una cadena que representa la variable de patrón de fila con la que está asociada la fila de resultados (en nuestro caso, A, B o C).

    Función R020, "Reconocimiento de patrón de fila:cláusula WINDOW"

    La función R020 utiliza el reconocimiento de patrón de fila como parte de la cláusula OVER de la ventana (o la cláusula WINDOW cuando se nombra una especificación de ventana) para restringir aún más un marco de ventana. Al igual que la partición de la ventana restringe las filas de la expresión de la tabla de entrada (DE... DÓNDE... AGRUPAR POR... HABER), y el marco de la ventana restringe aún más la partición de la ventana, con la función R020 restringe aún más el marco de la ventana completa a un marco de ventana reducido hecho de la subsecuencia de filas que constituyen la coincidencia de patrones. Aquí hay una consulta que demuestra esta característica con la cláusula WINDOW, utilizando una especificación de coincidencia de patrón de fila similar a la utilizada en la primera consulta de este artículo:

    SELECCIONE T.símbolo, T.fecha comercial, T.precio, fecha de inicio SOBRE W, precio de inicio SOBRE W, fecha inferior SOBRE W, precio inferior SOBRE W, fecha final SOBRE W, precio final SOBRE W, precio máximo SOBRE WFROM dbo.Ticker TWINDOW FUE ( PARTICIÓN POR símbolo ORDEN POR fecha de negociación MEDIDAS A.fecha de negociación AS fecha de inicio, A.precio AS precio de inicio, ÚLTIMO(B.fecha de negociación) AS fecha inferior, ÚLTIMO(B.precio) AS precio inferior, ÚLTIMO(C.fecha de negociación) AS fecha de finalización, ÚLTIMO(C. precio) COMO precio final, MAX(U.price) COMO maxprice FILAS ENTRE LA FILA ACTUAL Y SIGUIENTE SIN LÍMITES DESPUÉS DEL PARTIDO SALTAR ÚLTIMA FILA INICIAL -- el patrón debe comenzar en la primera fila del marco de la ventana completa; la alternativa es BUSCAR PATRÓN (A B+ C+) SUBCONJUNTO U =(A, B, C) DEFINE B COMO B.precio  PREV(C.precio) );

    Cuando se utiliza el reconocimiento de patrones de fila con ventanas, el marco completo de la ventana debe comenzar en la fila actual. Observe el uso de la opción INITIAL en esta consulta. Esta opción significa que obtiene una coincidencia solo si el patrón comienza con la fila actual. La alternativa es SEEK, lo que significa que la búsqueda de una coincidencia comienza con la fila actual, pero se permite hasta el final del marco de la ventana completa. De cualquier manera, si se encuentra una coincidencia, el marco de la ventana reducida consiste solo en las filas de coincidencia de patrón; de lo contrario, el marco de la ventana reducida está vacío. Solo se busca una coincidencia de patrón de fila por marco de ventana completo.

    Observe en la lista SELECT de la consulta que puede devolver medidas definidas en la cláusula MEASURES, calculadas sobre W, que es el marco de ventana reducido.

    Recuerde el resultado de la primera consulta de este artículo, usando el reconocimiento de patrón de fila en la cláusula FROM, con la opción ONE ROW PER MATCH:

    símbolo número de coincidencia fecha de inicio precio de inicio bottomdat precio inferior fecha de finalización precio de finalización maxprice------ -------- ---------- ---------- ---- ------ ----------- ---------- -------- --------EXISTENCIA1 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  

    Este es el resultado esperado de nuestra última consulta, utilizando el reconocimiento de patrones de fila en la cláusula WINDOW:

    símbolo tradedate precio startdate startprice bottomdate bottomprice enddate endprice maxprice------ ---------- ------ ---------- ----- ----- ---------- ----------- ---------- -------- ------ -- STOCK1 2019-02-12 150.00 NULO NULO NULO NULO NULO NULO NULO STOCK1 2019-02-13 151.00 2019-02-13 151.00 2019-02-18 142.00 2019-02-20 152.00 152.00STOCK10 2019 NULO 8-049 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 NULL NULL NULLSTOCK1 2019-02-19 144.00 NULL NULL NULL NULL NULL NULL NULLSTOCK1 2019-02-00 152-00 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 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 NULL NULLSTOCK1 2019-02-07 1504.00 154.00 02-27 154.00 2019-03-04 140.00 2019-03-06 143.00 154.00EXISTENCIA1 2019-02-28 153.00 NULO NULO NULO NULO NULO NULO NULOSTOCK1 2019-03-01 145.00 NULO NULO NULO NULO9-04 04 NULO2 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-029.103 330.00 NULL NULL NULL NULLSTOCK2 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 2 NULL01 NULL8-2 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 NULLSTOCK2 2019-02-21 326.00 2019-02-21 32 019-02-25 317.00 2019-02-27 325.00 326.00EXISTENCIA2 2019-02-22 320.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-25 317.00 NULL NULL NULL NULL NULL NULL NULLEXISTENCIA2 2019-02-06 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-90 05-03-05 -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 NULL NULL 30 2-0709-23 NULO 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 filas afectadas.

    Observe que obtiene todas las filas detalladas en la salida, y donde comienza una coincidencia de patrón, obtiene el resultado de las medidas de patrón de fila solicitadas contra el marco de ventana reducido.

    Emite tu voto

    Se entiende completamente que para Microsoft agregar una función a T-SQL, especialmente una tan importante, es una inversión bastante significativa. Pero lo bueno de las características que se agregan a T-SQL es que prácticamente permanecen allí para siempre. Hay una gran comunidad hambrienta de mejoras de T-SQL como esta.

    Si cree que el reconocimiento de patrones de fila es una adición importante a SQL Server, asegúrese de emitir su voto. Además, es más probable que Microsoft priorice una función propuesta si conocen clientes y casos de uso que podrían beneficiarse de ella, y que en ese momento esos clientes están usando otros productos o soluciones más complejas. Si usted o sus clientes ven que RPR es beneficioso para ustedes y tienen casos de uso que pueden compartir, asegúrese de agregar comentarios al elemento de comentarios e informar a Microsoft.