Стандартът ISO/IEC 9075:2016, или накратко SQL:2016, въвежда поддръжка за задълбочена концепция, наречена Разпознаване на модели на редове (RPR) в SQL. Публикувах предложение за подобряване на SQL Server чрез добавяне на поддръжка за RPR в T-SQL, но бях доста ограничен в пространството, което трябваше да предоставя обратна връзка. Целта на тази статия е да предостави повече подробности за предложението и се надяваме, че ще се убедите в важността му и ще добавите своя глас.
Фон
Подобно на използването на регулярни изрази за идентифициране на модели в низ, с RPR използвате регулярни изрази, за да идентифицирате модели в поредица от редове. За всяко съвпадение на шаблона можете или да върнете обобщен ред, като при групиране, или подробните редове с изчислени мерки спрямо подпоследователности на съвпадението. RPR има неограничени практически приложения, включително идентифициране на модели в дейността на фондовия пазар (както валидни модели с търговска стойност, така и потенциално незаконни или подозрителни модели), обработка на времеви серии, откриване на измами, обработка на материали, приложения за доставка, ДНК последователност, пропуски и острови, горе N за група и много други.
За мен RPR е следващата стъпка в еволюцията на функциите на прозорците, с по-високо ниво на сложност и разширена полезност. Ако смятате, че функциите на прозореца са задълбочени и полезни, RPR наистина ще изпече вашата юфка. Подобно на функциите на прозореца, RPR поддържа разделяне и подреждане. Обикновено ще търсите съвпадения на шаблони във всеки дял независимо, въз основа на посочената подредба. Също подобно на функциите на прозореца, RPR се поддава на добра оптимизация, с възможността да разчита на подреждане на индекси, за да избегне сортирането на данните.
Можете да намерите покритие на RPR, включително илюстрирани примери, в технически доклад от 90 страници ISO/IEC TR 19075-5 (достъпен безплатно).
Можете също да го намерите като част от документа ISO/IEC 9075-2:2016, Информационни технологии — Езици на бази данни — SQL — Част 2:Основа (SQL/Foundation) (достъпно за закупуване).
Стандартът SQL:2016 предоставя две основни функции, свързани с RPR:
- Функция R010, „Разпознаване на шаблони на редове:клауза FROM“
- Функция R020, „Разпознаване на шаблони на ред:клауза WINDOW“
Стандартът също така споменава функция R030, „Разпознаване на шаблони на редове:пълна поддръжка на агрегати“, без която на агрегатните функции не е разрешено да определят DISTINCT или
Досега единствената платформа, която знам за тази внедрена функция R010, е Oracle. Все още не знам никоя платформа, която да внедри R020.
Функция R010, „Разпознаване на шаблон на ред:клауза FROM“
Функция R010 дефинира оператор на клауза/таблица, наречен MATCH_RECOGNIZE, който използвате в клаузата FROM. Входът е таблица или табличен израз, а изходът е виртуална таблица. Контекстът е подобен на този на други таблични оператори като JOIN, APPLY, PIVOT и UNPIVOT. Ето синтаксиса на заявка, използваща тази функция:
ИЗБЕРЕТЕ <изберете списък> ОТ <изходна таблица> MATCH_RECOGNIZE ( [ PARTITION BY <списък на дялове> ] [ ORDER BY <подреждане по списък> ] [ MEASURES <списък с мерки> ] [ <редове шаблон на редове на съвпадение> ::=ЕДИН РЕД НА СЪВЪВпадение | ВСИЧКИ РЕДОВЕ НА СЪВЪВпадение ] [ СЛЕД СЪВпадение <прескочете към опция> ШАБЛОН ( <шаблон на ред> ) [ ПОДНАБОР <списък на подмножества> ] DEFINE <списък с дефиниции> ) КАТО <псевдоним на таблица>;
Като пример, адаптиран от гореспоменатия технически доклад, да предположим, че ви е дадена таблица dbo.Ticker, със символ на колони, дата на търговия и цена. Използвайте следния код, за да създадете таблицата, да я попълните с някои примерни данни и да я запитате:
ЗАДАДЕТЕ NOCOUNT ON; ИЗПОЛЗВАЙТЕ tempdb; ИЗПУСКАНЕ ТАБЛИЦА, АКО СЪЩЕСТВУВА dbo.Ticker; CREATE TABLE dbo.Ticker( символ VARCHAR(10) NOT NULL, tradedate DATE NOT NULL, price NUMERIC(12, 2) NOT NULL, CONSTRAINT PK_Ticker PRIMARY KEY (символ, tradedate));GO INSERT INTO dbo.Tickerda(symbol) , цена) СТОЙНОСТИ ('STOCK1', '20190212', 150.00), ('STOCK1', '20190213', 151.00), ('STOCK1', '20190214', 148.00), ('STOCK1', '01.016) ), ('STOCK1', '20190218', 142,00), ('STOCK1', '20190219', 144,00), ('STOCK1', '20190220', 152,00), ('STOCK1', '2019, 2019) ('STOCK1', '20190222', 153,00), ('STOCK1', '20190225', 154,00), ('STOCK1', '20190226', 154,00), ('STOCK1', '20190225', '20190225.'), STOCK1', '20190228', 153,00), ('STOCK1', '20190301', 145,00), ('STOCK1', '20190304', 140,00), ('STOCK1', '201901301'0,'520 , '20190306', 143,00), ('STOCK1', '20190307', 142,00), ('STOCK1', '20190308', 140,00), ('STOCK1', '20190311'0', '0), ('STOCK1', '20190311', '11) 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), ('20190219, 20190218, 325,00) , ('STOCK2', '20190221', 326,00), ('STOCK2', '20190222', 320,00), ('STOCK2', '20190225', 317,00), ('STOCK2', '2019, 2019) 'STOCK2', '20190227', 325.00), ('STOCK2', '20190228', 322.00), ('STOCK2', '20190301', 324.00), ('STOCK2', '20190228', 322.00), ('STOCK2', '20190301', 324.00), ('STOCK2', '20190228', '20190320,' ', '20190305', 319,00), ('STOCK2', '20190306', 322,00), ('STOCK2', '20190307', 326,00), ('STOCK2', '201903208','0), ('STOCK2', '201903208','20 '20190311', 324,00); ИЗБЕРЕТЕ символ, търговска дата, цена ОТ dbo.Ticker;
Този код генерира следния изход:
символ дата на търговия цена------ ---------- ------ НАЛИЧНИ 1 2019-02-12 150,00 НАЛИЧНИ 1 2019-02-13 151,00 НАЛИЧНИ 1 2019-02-14 148,00 НАЛИЧНИ 1 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 -02-26 154,00 СКЛАД1 2019-02-27 154,00 СКЛАД1 2019-02-28 153,00 СКЛАД1 2019-03-01 145,00 СКЛАД1 2019-03-04 140,20 100 140,20 100 1020 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,00 ЗАЛИЧНИ 2 2019-02-19 326,00 НАЛИЧНИ 2 2019-02-20 328,00 ЗАПАСИ 2 2019-02-21 326,00 ЗАПАСИ2 2019-02-22 320,00 СТОК 2 320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 325,00 НАЛИЧНИ 2 2019-02-28 322,00 НАЛИЧНИ 2 2019-03-01 324,00 НАЛИЧНИ 2 2019-03-04 321,00 НАЛИЧНИ 2 2019-03-05 319,00 НАЛИЧНИ 2 2019-03-06 322,00STOCK2 2019-03-07 326,00STOCK2 2019-03-08 326,00STOCK2 2019-03-11 324,0040 ред(а) засегнати.
Следната заявка идентифицира модели, представляващи V-образни форми в цената на акциите (период със строго падаща цена, последван от период със строго нарастваща цена), като се използва ЕДИН РЕД НА СЪВЪВпадение като редове шаблон на съвпадение опция:
ИЗБЕРЕТЕ MR.symbol, MR.matchnum, MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR.maxpriceFROM dbo.Ticker MATCH_RECOGNIZE ( PARTITION BY ORDda символ MEASURES MATCH_NUMBER() КАТО номер на съвпадение, A.tradedate КАТО начална дата, A.цена КАТО начална цена, LAST(B.tradedate) КАТО долна дата, LAST(B.цена) КАТО долна цена, LAST(C.tradedate) КАТО крайна дата, -- същото като ПОСЛЕДНО(търгуване) ПОСЛЕДНО(C.цена) КАТО крайна цена, MAX(U.цена) КАТО макс.цена -- същото като MAX(цена) ЕДИН РЕД НА МАЧ -- по подразбиране СЛЕД МАЧ ПРОПУСКАНЕ НА ПОСЛЕДЕН РЕД -- МОДЕЛ по подразбиране (A B+ C+ ) SUBSET U =(A, B, C) DEFINE -- A по подразбиране е True, съответства на всеки ред, същото като изричното дефиниране на A AS 1 =1 B AS B.ценаPREV(C.price) ) AS MR;
Клаузата PARTITION BY дефинира, че искате да обработвате всеки борсов символ поотделно.
Клаузата ORDER BY дефинира поръчката въз основа на датата на търговия.
Клаузата DEFINE дефинира променливи на модел на редове, представляващи различните подпоследователности от редове в шаблона. В горния пример A представлява всеки ред като отправна точка, B представлява подпоследователност от намаляващи цени (B.цена
Клаузата PATTERN използва регулярни изрази за идентифициране на модел. В горната заявка моделът е (A B+ C+), което означава (всеки ред, последван от един или повече реда с намаляващи цени, последвани от един или повече реда с нарастващи цени). Следват квантификатори на модел на регулярни изрази, които можете да използвате:
* — нула (0) или повече съвпадения+ — едно (1) или повече съвпадения? — няма съвпадение или едно (1) съвпадение, по избор{ n } — точно n съвпадения{ n, } — n или повече съвпадения{ n, m } — между n и m (включително) съвпадения{ , m } — между нула (0 ) и m (включително) съвпадения{- Променлива -}, напр., {- A -} — показва, че съвпадащите редове трябва да бъдат изключени от изхода (полезно само ако е посочен ВСИЧКИ РЕД НА СЪВпадение)|, напр. A | B — alternation(), напр., (A | B) — групиране^, напр., ^A{1, 3} — начало на разделяне на шаблон на ред$, напр. A{1, 3}$ — край на шаблон на ред дял
По подразбиране кванторите са алчни, но можете да ги дефинирате като неохотни.
Клаузата SUBSET ви позволява да дефинирате списък с именуван подмножество от променливи.
Клаузата MEASURES дефинира мерки, свързани с модела. Можете да приложите изчисления към променливи на шаблона и към подмножества. Функцията MATCH_NUMBER() присвоява последователни цели числа, започващи с 1 за съвпаденията в рамките на дяла. Можете да използвате операции като FIRST, LAST, PREV и NEXT, както и обобщени изчисления.
Тази заявка използва ЕДИН РЕД НА СЪВЪВпадение като опция за шаблон на редове за съвпадение. Това означава, че таблицата с резултати ще има един ред за съвпадение на шаблон, подобно на резултата от групирането. Алтернативата е ВСИЧКИ РЕДОВЕ НА СЪВпадение, където искате редовете с подробности да се връщат за съвпадение на шаблон (пример, който следва скоро).
Тази заявка използва AFTER MATCH SKIP ПОСЛЕДНИЯ РЕД като AFTER MATCH <преминаване към опция>. Това означава, че след като се намери съвпадение, искате следващият опит да започне след последния ред на текущото съвпадение. Има и други алтернативи, като търсене на следващото съвпадение в реда, следващ първия ред на текущото съвпадение (ПРЕКЪЩ НА СЛЕДВАЩИЯ РЕД) или да прескочите до позиция спрямо променлива на модел на ред.
Ето очаквания резултат от тази заявка:
symbol matchnum начална дата начална цена bottomdat bottomprice крайна дата крайна цена maxprice ---- ------ ----------- ---------- --------- -------- НАЛИЧНИ 1 1 13.02.2019 г. 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 / предварително>Ето една леко модифицирана версия на заявката, използваща опцията ВСИЧКИ РЕДОВЕ НА СЪВЪВпадение:
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 символ ПОРЪЧКА ПО търговски дата МЕРКИ MATCH_NUMBER() КАТО matchnum, CLASSIFIER() КАТО класен, A.tradedate КАТО начална дата, A.цена КАТО начална цена, LAST(B.tradedate) LAST(B.tradedate) ASBdate. цена) КАТО долна цена, LAST(C.tradedate) КАТО крайна дата, LAST(C.price) КАТО крайна цена, MAX(U.цена) КАТО макс.цена ВСИЧКИ РЕДОВЕ НА МАЧ СЛЕД МАЧ ПРОПУСКАНЕ НА ПОСЛЕДНИЯ РЕД (A B+ C+) ПОДНАБОР U =(A, B, C) ДЕФИНИРАЙТЕ B КАТО B.ценаPREV(C.цена) ) AS MR; Ето очаквания резултат от тази заявка:
symbol tradedate price matchnum classy startdate начална цена bottomdate bottomprice крайна дата крайна цена maxprice------ ---------- ------ --------- ----- ---------- ---------- ---------- ----------- -------- -- --------- --------ЗАЛИКА1 2019-02-13 151,00 1 A 2019-02-13 151,00 NULL NULL NULL NULL 151,00 СКЛАД1 2019-02-14 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.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,00 НАЛИЧНИ 1 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 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 329,00 STOCK2 2019-02-15 326,00 1 B 2019-02-14 329,00 2019-32 02 01 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 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-22 320.00 2 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 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-04 321.00 3 B 2019-03-01 324.00 2019-03-04 321.00 NULL NULL 324.00 STOCK2 2019-03-04 321.01 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 ред(ове) засегнати.Забележете добавянето на мярката classy въз основа на функцията CLASSIFIER. Тази функция връща низ, представляващ променливата на модела на реда, с която е свързан резултатният ред (в нашия случай A, B или C).
Функция R020, „Разпознаване на шаблони на ред:клауза WINDOW“
Функция R020 използва разпознаване на шаблони на редове като част от клаузата OVER за отваряне на прозорци (или клауза WINDOW, когато се наименува спецификация на прозорец), за допълнително ограничаване на рамката на прозореца. Точно както дялът на прозореца ограничава редовете на израза на входната таблица (ОТ... КЪДЕ... ГРУПА ОТ... ИМАМ), а рамката на прозореца допълнително ограничава дяла на прозореца, с функция R020 допълнително ограничавате пълната рамка на прозореца до направена намалена рамка на прозореца на подпоследователността от редове, съставляващи съвпадението на шаблона. Ето заявка, демонстрираща тази функция с клаузата WINDOW, като се използва подобна спецификация за съвпадение на модел на ред с тази, използвана в първата заявка в тази статия:
ИЗБЕРЕТЕ T.symbol, T.tradedate, T.price, начална дата НАД W, начална цена НАД W, долна дата НАД W, долна цена НАД W, крайна дата НАД W, крайна цена НАД W, максимална цена НАД WFROM dbo.Ticker TWINDOW W AS ( РАЗДЕЛЯНЕ ПО символ ПОРЪЧКА ПО ТЪРГОВНА МЕРКИ A.tradedate КАТО начална дата, A.price КАТО начална цена, LAST(B.tradedate) КАТО долна дата, LAST(B.price) КАТО долна цена, LAST(C.tradedate) КАТО крайна дата, LAST(C. цена) КАТО крайна цена, MAX(U.цена) КАТО макс.цена РЕДОВЕ МЕЖДУ ТЕКУЩ РЕД И НЕОГРАНИЧЕН СЛЕД СЛЕД МАЧ ПРОПУСКАНЕ ПОСЛЕДЕН ПОСЛЕДЕН РЕД НАЧАЛНАТАЛНА -- моделът трябва да започва от първия ред на пълната рамка на прозореца; алтернативата е ТЪРСЕТЕ МОДЕЛ (A B+ C+) ПОДмножество U =(A, B, C) ДЕФИНИРАЙТЕ B КАТО B.ценаPREV(C.цена) ); Когато използвате разпознаване на шаблони на редове с прозорец, цялата рамка на прозореца трябва да започва от текущия ред. Обърнете внимание на използването на опцията INITIAL в тази заявка. Тази опция означава, че получавате съвпадение само ако шаблонът започва с текущия ред. Алтернативата е SEEK, което означава, че търсенето на съвпадение започва с текущия ред, но е разрешено до края на пълния кадър на прозореца. Така или иначе, ако бъде намерено съвпадение, намалената рамка на прозореца се състои само от редовете за съответствие на шаблона, в противен случай намалената рамка на прозореца е празна. Търси се само едно съвпадение на модел на ред на цяла рамка на прозореца.
Забележете в списъка SELECT на заявката, че можете да върнете мерки, дефинирани в клаузата MEASURES, изчислени върху W, което е намалената рамка на прозореца.
Припомнете си резултата от първата заявка в тази статия, като използвате разпознаване на шаблони на редове в клаузата FROM, с опцията ONE ROW PER MATCH:
symbol matchnum начална дата начална цена bottomdat bottomprice крайна дата крайна цена maxprice ---- ------ ----------- ---------- --------- -------- НАЛИЧНИ 1 1 13.02.2019 г. 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 / предварително>Ето очаквания резултат от последната ни заявка, използвайки разпознаване на шаблони на ред в клаузата WINDOW:
symbol tradedate цена начална дата начална цена долна дата долна цена крайна дата крайна цена макс. цена------ ---------- ------ ---------- ----- ----- ---------- ----------- ---------- --------- ------ -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.stock1 2019-02-14 148.00 Null Null 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 NULLS1 NULL 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 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 Null Nullstock1 2019-03-04 140.00 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 NULL NULL NULL NULL 01 NULL NULL NULL 01 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 NULLSTOCK2 2019-02-12 330.00 NULL NULL NULL NULL NULL NULLS2 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 NULL NULLST2 2019-02-18 325.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 2019-02-19 326.00 NULL NULL NULL NULL NULL NULLSTC2 2019-02-20 328.00 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 NULL NULL NULL NULL NULL NULL NULL NULLST2 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 NULLSTC2 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 NULLSTOCK2 2019-03-06 322.00 NULL NULL NULL NULL NULL NULL NULLSTOCK2 НУЛА 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> засегна.Забележете, че получавате всички подробни редове в изхода и когато започне съвпадението на шаблона, получавате резултата от исканите мерки за модел на ред спрямо намалената рамка на прозореца.
Гласувайте
Напълно разбираемо е, че за Microsoft добавянето на функция към T-SQL – особено такава значителна – е доста значителна инвестиция. Но това, което е страхотно за функциите, които се добавят към T-SQL, е, че те почти остават там завинаги. Има огромна общност, жадна за подобрения на T-SQL като това.
Ако смятате, че разпознаването на шаблони на редове е важно допълнение към SQL Server, не забравяйте да гласувате. Освен това Microsoft е по-вероятно да даде приоритет на предложена функция, ако знае за клиенти и случаи на използване, които биха могли да се възползват от нея, и че в момента такива клиенти използват или други продукти, или по-сложни решения. Ако вие или вашите клиенти виждате RPR като полезен за вас и имате случаи на употреба, които можете да споделите, уверете се, че сте добавили коментари към елемента за обратна връзка и уведомете Microsoft.