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
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
このクエリの予想される出力は次のとおりです。
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に知らせてください。