sql >> データベース >  >> RDS >> Database

SQLでの行パターン認識

    ISO / IEC 9075:2016標準、または略してSQL:2016は、SQLの行パターン認識(RPR)と呼ばれる深遠な概念のサポートを導入しています。 T-SQLでRPRのサポートを追加してSQLServerを改善するための提案を投稿しましたが、フィードバックを提供しなければならないスペースにはかなりの制限がありました。この記事の目的は、提案の詳細を提供することです。うまくいけば、その重要性を確信し、投票を追加することができます。

    背景

    文字列内のパターンを識別するために正規表現を使用するのと同様に、RPRでは、行のシーケンス内のパターンを識別するために正規表現を使用します。パターン一致ごとに、グループ化のように要約行を返すか、一致のサブシーケンスに対して計算されたメジャーを含む詳細行を返すことができます。 RPRには、株式市場活動のパターンの特定(取引価値のある有効なパターン、および潜在的に違法または疑わしいパターンの両方)、時系列の処理、不正検出、マテリアルハンドリング、出荷アプリケーション、DNAシーケンス、ギャップとアイランド、トップなど、無限の実用的なアプリケーションがあります。グループあたりのN、および他の多く。

    私にとって、RPRはウィンドウ関数の進化における次のステップであり、より高度なレベルと拡張されたユーティリティを備えています。ウィンドウ関数が深遠で便利だと思うなら、RPRは本当にあなたの麺を焼くつもりです。ウィンドウ関数と同様に、RPRはパーティション分割と順序付けをサポートします。通常、指定された順序に基づいて、各パーティション内で個別にパターンの一致を探します。また、ウィンドウ関数と同様に、RPRは、データの並べ替えを回避するためにインデックスの順序に依存する機能を備えた、優れた最適化に役立ちます。

    図解された例を含むRPRの範囲は、90ページのテクニカルレポートISO / IEC TR 19075-5(無料で入手可能)にあります。

    また、ドキュメントISO / IEC 9075-2:2016、情報技術—データベース言語— SQL —パート2:Foundation(SQL / Foundation)(購入可能)の一部として見つけることもできます。

    SQL:2016標準は、RPR関連の2つの主要な機能を提供します。

    • 機能R010、「行パターン認識:FROM句」
    • 機能R020、「行パターン認識:WINDOW句」

    この標準では、機能R030「行パターン認識:完全な集計サポート」についても言及されています。これがないと、集計関数でDISTINCTまたはを指定できません。

    これまでのところ、実装された機能R010について私が知っている唯一のプラットフォームはOracleです。 R020を実装したプラットフォームはまだ知りません。

    機能R010、「行パターン認識:FROM句」

    機能R010は、FROM句で使用するMATCH_RECOGNIZEと呼ばれる句/テーブル演算子を定義します。入力はテーブルまたはテーブル式であり、出力は仮想テーブルです。コンテキストは、JOIN、APPLY、PIVOT、UNPIVOTなどの他のテーブル演算子のコンテキストと似ています。この機能を使用したクエリの構文は次のとおりです。

    SELECT <select list> 
    FROM <source table> 
      MATCH_RECOGNIZE 
      ( 
        [ PARTITION BY <partition list> ]
        [ ORDER BY <order by list> ]
        [ MEASURES <measure list> ]
        [ <row pattern rows per match> ::= ONE ROW PER MATCH | ALL ROWS PER MATCH ]
        [ AFTER MATCH <skip to option>
        PATTERN ( <row pattern> )
        [ SUBSET <subset list> ]
        DEFINE <definition list> 
      ) AS <table alias>;

    前述のテクニカルレポートを応用した例として、列の記号、取引日、価格が記載されたテーブルdbo.Tickerが与えられたとします。次のコードを使用してテーブルを作成し、サンプルデータを入力して、クエリを実行します。

    SET NOCOUNT ON;
     
    USE tempdb;
     
    DROP TABLE IF EXISTS dbo.Ticker;
     
    CREATE TABLE dbo.Ticker
    (
      symbol    VARCHAR(10)    NOT NULL,
      tradedate DATE           NOT NULL,
      price     NUMERIC(12, 2) NOT NULL,
      CONSTRAINT PK_Ticker
        PRIMARY KEY (symbol, tradedate)
    );
    GO
     
    INSERT INTO dbo.Ticker(symbol, tradedate, price) VALUES
      ('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 symbol, tradedate, price FROM dbo.Ticker;

    このコードは次の出力を生成します:

    symbol  tradedate   price
    ------  ----------  ------ 
    STOCK1  2019-02-12  150.00
    STOCK1  2019-02-13  151.00
    STOCK1  2019-02-14  148.00
    STOCK1  2019-02-15  146.00
    STOCK1  2019-02-18  142.00
    STOCK1  2019-02-19  144.00
    STOCK1  2019-02-20  152.00
    STOCK1  2019-02-21  152.00
    STOCK1  2019-02-22  153.00
    STOCK1  2019-02-25  154.00
    STOCK1  2019-02-26  154.00
    STOCK1  2019-02-27  154.00
    STOCK1  2019-02-28  153.00
    STOCK1  2019-03-01  145.00
    STOCK1  2019-03-04  140.00
    STOCK1  2019-03-05  142.00
    STOCK1  2019-03-06  143.00
    STOCK1  2019-03-07  142.00
    STOCK1  2019-03-08  140.00
    STOCK1  2019-03-11  138.00
    STOCK2  2019-02-12  330.00
    STOCK2  2019-02-13  329.00
    STOCK2  2019-02-14  329.00
    STOCK2  2019-02-15  326.00
    STOCK2  2019-02-18  325.00
    STOCK2  2019-02-19  326.00
    STOCK2  2019-02-20  328.00
    STOCK2  2019-02-21  326.00
    STOCK2  2019-02-22  320.00
    STOCK2  2019-02-25  317.00
    STOCK2  2019-02-26  319.00
    STOCK2  2019-02-27  325.00
    STOCK2  2019-02-28  322.00
    STOCK2  2019-03-01  324.00
    STOCK2  2019-03-04  321.00
    STOCK2  2019-03-05  319.00
    STOCK2  2019-03-06  322.00
    STOCK2  2019-03-07  326.00
    STOCK2  2019-03-08  326.00
    STOCK2  2019-03-11  324.00
    
    40 row(s) affected.

    次のクエリは、株価のV字型を表すパターンを識別します(厳密に値下がりした期間の後に厳密に値上がりした期間)。一致ごとの行パターン行として1行ごとに1行を使用します。 オプション:

    SELECT
      MR.symbol, MR.matchnum, MR.startdate, MR.startprice,
      MR.bottomdate, MR.bottomprice, MR.enddate, MR.endprice, MR.maxprice
    FROM 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, -- same as LAST(tradedate)
          LAST(C.price) AS endprice,
          MAX(U.price) AS maxprice -- same as MAX(price)
        ONE ROW PER MATCH -- default
        AFTER MATCH SKIP PAST LAST ROW -- default
        PATTERN (A B+ C+)
        SUBSET U = (A, B, C)
        DEFINE
          -- A defaults to True, matches any row, same as explicitly defining A AS 1 = 1
          B AS B.price < PREV(B.price),
          C AS C.price > PREV(C.price)
      ) AS MR;

    PARTITION BY句は、各銘柄記号を個別に処理することを定義します。

    ORDER BY句は、取引日に基づく注文を定義します。

    DEFINE句は、パターン内の行のさまざまなサブシーケンスを表す行パターン変数を定義します。上記の例では、Aは開始点として任意の行を表し、Bは値下がりのサブシーケンス(B.price PREV( C.price))。

    PATTERN句は、正規表現を使用してパターンを識別します。上記のクエリでは、パターンは(A B + C +)であり、(任意の行の後に価格が下がる1つ以上の行が続き、その後に価格が上がる1つ以上の行が続く)を意味します。使用できる正規表現パターンの量指定子は次のとおりです。

    * — zero (0) or more matches
    + — one (1) or more matches
    ? — no match or one (1) match, optional
    { n } — exactly n matches
    { n, } — n or more matches
    { n, m } — between n and m (inclusive) matches
    { , m } — between zero (0) and m (inclusive) matches
    {- Variable -}, e.g., {- A -} — indicates that matching rows are to be excluded from the output (useful only if ALL ROW PER MATCH specified)
    |, e.g., A | B — alternation
    (), e.g., (A | B) — grouping
    ^, e.g., ^A{1, 3} — start of a row pattern partition
    $, e.g., A{1, 3}$ — end of a row pattern partition 

    デフォルトでは、量指定子は貪欲ですが、気が進まないように定義できます。

    SUBSET句を使用すると、変数の名前付きサブセットリストを定義できます。

    MEASURES句は、パターンに関連するメジャーを定義します。パターン変数とサブセットに計算を適用できます。 MATCH_NUMBER()関数は、パーティション内の一致に1から始まる連続した整数を割り当てます。 FIRST、LAST、PREV、NEXTなどの操作と、集計計算を使用できます。

    このクエリは、一致オプションごとの行パターン行として、一致ごとに1つの行を使用します。これは、グループ化の結果と同様に、結果テーブルのパターン一致ごとに1つの行があることを意味します。別の方法は、パターンマッチごとに詳細行を返す場合のALL ROWS PER MATCHです(例はすぐに続きます)。

    このクエリは、AFTER MATCH としてAFTERMATCHSKIP PASTLASTROWを使用します。これは、一致が見つかったら、現在の一致の最後の行の後に次の試行を開始することを意味します。現在の一致の最初の行に続く行で次の一致を探す(SKIP TO NEXT ROW)、または行パターン変数に相対的な位置にスキップするなど、他の選択肢があります。

    このクエリの予想される出力は次のとおりです。

    symbol  matchnum  startdate   startprice  bottomdat   bottomprice  enddate     endprice  maxprice
    ------  --------  ----------  ----------  ----------  -----------  ----------  --------  --------
    STOCK1  1         2019-02-13  151.00      2019-02-18  142.00       2019-02-20  152.00    152.00
    STOCK1  2         2019-02-27  154.00      2019-03-04  140.00       2019-03-06  143.00    154.00
    STOCK2  1         2019-02-14  329.00      2019-02-18  325.00       2019-02-20  328.00    329.00
    STOCK2  2         2019-02-21  326.00      2019-02-25  317.00       2019-02-27  325.00    326.00
    STOCK2  3         2019-03-01  324.00      2019-03-05  319.00       2019-03-07  326.00    326.00

    これは、ALL ROWSPERMATCHオプションを使用したクエリのわずかに変更されたバージョンです。

    SELECT
      MR.symbol, MR.tradedate, MR.price, MR.matchnum, MR.classy, 
      MR.startdate, MR.startprice, MR.bottomdate, MR.bottomprice,
      MR.enddate, MR.endprice, MR.maxprice
    FROM 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.price) AS bottomprice,
          LAST(C.tradedate) AS enddate,
          LAST(C.price) AS endprice,
          MAX(U.price) AS maxprice
        ALL ROWS PER MATCH
        AFTER MATCH SKIP PAST LAST ROW
        PATTERN (A B+ C+)
        SUBSET U = (A, B, C)
        DEFINE
          B AS B.price < PREV(B.price),
          C AS C.price > PREV(C.price)
      ) AS MR;

    このクエリの予想される出力は次のとおりです。

    symbol  tradedate   price   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.00
    STOCK1  2019-02-14  148.00  1         B       2019-02-13  151.00     2019-02-14  148.00      NULL        NULL       151.00
    STOCK1  2019-02-15  146.00  1         B       2019-02-13  151.00     2019-02-15  146.00      NULL        NULL       151.00
    STOCK1  2019-02-18  142.00  1         B       2019-02-13  151.00     2019-02-18  142.00      NULL        NULL       151.00
    STOCK1  2019-02-19  144.00  1         C       2019-02-13  151.00     2019-02-18  142.00      2019-02-19  144.00     151.00
    STOCK1  2019-02-20  152.00  1         C       2019-02-13  151.00     2019-02-18  142.00      2019-02-20  152.00     152.00
    STOCK1  2019-02-27  154.00  2         A       2019-02-27  154.00     NULL        NULL        NULL        NULL       154.00
    STOCK1  2019-02-28  153.00  2         B       2019-02-27  154.00     2019-02-28  153.00      NULL        NULL       154.00
    STOCK1  2019-03-01  145.00  2         B       2019-02-27  154.00     2019-03-01  145.00      NULL        NULL       154.00
    STOCK1  2019-03-04  140.00  2         B       2019-02-27  154.00     2019-03-04  140.00      NULL        NULL       154.00
    STOCK1  2019-03-05  142.00  2         C       2019-02-27  154.00     2019-03-04  140.00      2019-03-05  142.00     154.00
    STOCK1  2019-03-06  143.00  2         C       2019-02-27  154.00     2019-03-04  140.00      2019-03-06  143.00     154.00
    STOCK2  2019-02-14  329.00  1         A       2019-02-14  329.00     NULL        NULL        NULL        NULL       329.00
    STOCK2  2019-02-15  326.00  1         B       2019-02-14  329.00     2019-02-15  326.00      NULL        NULL       329.00
    STOCK2  2019-02-18  325.00  1         B       2019-02-14  329.00     2019-02-18  325.00      NULL        NULL       329.00
    STOCK2  2019-02-19  326.00  1         C       2019-02-14  329.00     2019-02-18  325.00      2019-02-19  326.00     329.00
    STOCK2  2019-02-20  328.00  1         C       2019-02-14  329.00     2019-02-18  325.00      2019-02-20  328.00     329.00
    STOCK2  2019-02-21  326.00  2         A       2019-02-21  326.00     NULL        NULL        NULL        NULL       326.00
    STOCK2  2019-02-22  320.00  2         B       2019-02-21  326.00     2019-02-22  320.00      NULL        NULL       326.00
    STOCK2  2019-02-25  317.00  2         B       2019-02-21  326.00     2019-02-25  317.00      NULL        NULL       326.00
    STOCK2  2019-02-26  319.00  2         C       2019-02-21  326.00     2019-02-25  317.00      2019-02-26  319.00     326.00
    STOCK2  2019-02-27  325.00  2         C       2019-02-21  326.00     2019-02-25  317.00      2019-02-27  325.00     326.00
    STOCK2  2019-03-01  324.00  3         A       2019-03-01  324.00     NULL        NULL        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-05  319.00  3         B       2019-03-01  324.00     2019-03-05  319.00      NULL        NULL       324.00
    STOCK2  2019-03-06  322.00  3         C       2019-03-01  324.00     2019-03-05  319.00      2019-03-06  322.00     324.00
    STOCK2  2019-03-07  326.00  3         C       2019-03-01  324.00     2019-03-05  319.00      2019-03-07  326.00     326.00
    
    27 row(s) affected.

    関数CLASSIFIERに基づくメジャーclassyの追加に注意してください。この関数は、結果の行が関連付けられている行パターン変数(この場合はA、B、またはC)を表す文字列を返します。

    機能R020、「行パターン認識:WINDOW句」

    機能R020は、ウィンドウのOVER句(またはウィンドウ仕様に名前を付ける場合はWINDOW句)の一部として行パターン認識を使用して、ウィンドウフレームをさらに制限します。ウィンドウパーティションが入力テーブル式の行を制限するのと同じように(FROM…WHERE…GROUP BY…HAVING)、ウィンドウフレームはウィンドウパーティションをさらに制限します。機能R020を使用すると、ウィンドウフレーム全体を縮小されたウィンドウフレームにさらに制限できます。パターン一致を構成する行のサブシーケンスの。この記事の最初のクエリで使用されたものと同様の行パターンマッチング仕様を使用して、WINDOW句でこの機能を示すクエリを次に示します。

    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 W
    FROM dbo.Ticker T
    WINDOW W AS
      (
        PARTITION BY symbol
        ORDER BY tradedate
        MEASURES
          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.price) AS endprice,
          MAX(U.price) AS maxprice
        ROWS BETWEEN CURRENT ROW
                 AND UNBOUNDED FOLLOWING
        AFTER MATCH SKIP PAST LAST ROW
        INITIAL -- pattern must start at first row of full window frame; alternative is SEEK
        PATTERN (A B+ C+)
        SUBSET U = (A, B, C)
        DEFINE
          B AS B.price < PREV(B.price),
          C AS C.price > PREV(C.price)
      );

    ウィンドウ処理で行パターン認識を使用する場合、ウィンドウフレーム全体が現在の行から開始する必要があります。このクエリでINITIALオプションが使用されていることに注意してください。このオプションは、パターンが現在の行で始まる場合にのみ一致を取得することを意味します。別の方法はSEEKです。これは、一致の検索が現在の行から始まり、ウィンドウフレーム全体の最後まで許可されることを意味します。いずれにせよ、一致が見つかった場合、縮小ウィンドウフレームはパターン一致行のみで構成され、それ以外の場合、縮小ウィンドウフレームは空になります。フルウィンドウフレームごとに1つの行パターン一致のみが求められます。

    クエリのSELECTリストで、縮小されたウィンドウフレームであるWに対して計算された、MEASURES句で定義されたメジャーを返すことができることを確認します。

    FROM句で行パターン認識を使用し、ONE ROW PER MATCHオプションを使用して、この記事の最初のクエリの結果を思い出してください。

    symbol  matchnum  startdate   startprice  bottomdat   bottomprice  enddate     endprice  maxprice
    ------  --------  ----------  ----------  ----------  -----------  ----------  --------  --------
    STOCK1  1         2019-02-13  151.00      2019-02-18  142.00       2019-02-20  152.00    152.00
    STOCK1  2         2019-02-27  154.00      2019-03-04  140.00       2019-03-06  143.00    154.00
    STOCK2  1         2019-02-14  329.00      2019-02-18  325.00       2019-02-20  328.00    329.00
    STOCK2  2         2019-02-21  326.00      2019-02-25  317.00       2019-02-27  325.00    326.00
    STOCK2  3         2019-03-01  324.00      2019-03-05  319.00       2019-03-07  326.00    326.00

    WINDOW句で行パターン認識を使用した、最後のクエリの予想される出力は次のとおりです。

    symbol  tradedate   price   startdate   startprice bottomdate  bottomprice enddate     endprice  maxprice
    ------  ----------  ------  ----------  ---------- ----------  ----------- ----------  --------  --------
    STOCK1  2019-02-12  150.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-13  151.00  2019-02-13  151.00     2019-02-18  142.00      2019-02-20  152.00    152.00
    STOCK1  2019-02-14  148.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-15  146.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-18  142.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-19  144.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-20  152.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-21  152.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-22  153.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-25  154.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-26  154.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-02-27  154.00  2019-02-27  154.00     2019-03-04  140.00      2019-03-06  143.00    154.00
    STOCK1  2019-02-28  153.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-01  145.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-04  140.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-05  142.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-06  143.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-07  142.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-08  140.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK1  2019-03-11  138.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-12  330.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-13  329.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-14  329.00  2019-02-14  329.00     2019-02-18  325.00      2019-02-20  328.00    329.00
    STOCK2  2019-02-15  326.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-18  325.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-19  326.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-20  328.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-21  326.00  2019-02-21  326.00     2019-02-25  317.00      2019-02-27  325.00    326.00
    STOCK2  2019-02-22  320.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-25  317.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-26  319.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-27  325.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-02-28  322.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-01  324.00  2019-03-01  324.00     2019-03-05  319.00      2019-03-07  326.00    326.00
    STOCK2  2019-03-04  321.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-05  319.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-06  322.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-07  326.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-08  326.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    STOCK2  2019-03-11  324.00  NULL        NULL       NULL        NULL        NULL        NULL      NULL
    
    40 row(s) affected.

    出力にすべての詳細な行が表示され、パターンマッチが開始される場所で、縮小されたウィンドウフレームに対して要求された行パターン測定の結果が得られることを確認してください。

    投票する

    MicrosoftがT-SQLに機能を追加すること、特にそのような重要な機能を追加することは、かなり重要な投資であることを完全に理解しています。ただし、T-SQLに追加された機能の優れている点は、それらがほぼ永久に存在することです。このようなT-SQLの改善に飢えている巨大なコミュニティがあります。

    行パターン認識がSQLServerへの重要な追加であると思われる場合は、必ず投票してください。また、Microsoftは、顧客とそのメリットを享受できるユースケースを知っていて、現時点でそのような顧客が他の製品またはより複雑なソリューションを使用している場合、提案された機能を優先する可能性が高くなります。あなたまたはあなたの顧客がRPRをあなたにとって有益であると考え、共有できるユースケースがある場合は、フィードバック項目にコメントを追加して、Microsoftに知らせてください。


    1. OracleでPLSQLブロックを実行する方法

    2. MySqlDateTimeスタンプをJavaScriptの日付形式に変換します

    3. ORA-01461:LONG列に挿入する場合にのみLONG値をバインドできます-照会時に発生します

    4. Oracle Fusion Middleware / WebLogicServer11gのインストール