私のテーブル構造は次のとおりです:
CREATE TABLE `market_trend_record` ( `date` 日付は NULL ではありません、 `シンボル` CHAR(40)、 `識別子` CHAR(20)、 `トレンド` CHAR(9)、 `期間` int, `daynr` int、 `price_quote` 10 進数 (16,6)、 主キー (`日付` , `シンボル` , `識別子`));
各シンボルの最新のエントリを取得するには (祝日のため、必ずしも同じ日付であるとは限りません)、次の操作を行います。
SELECTmarket_trend_record.symbol、market_trend_record.date、market_trend_record.trend、 Market_trend_record.duration、market_trend_record.price_quote FROM(シンボル選択、MAX(日付) AS date FROM Market_trend_record GROUP BY シンボル) AS last_record INNER JOIN マーケットトレンドレコード ON マーケットトレンドレコード.シンボル = 最新レコード.シンボル AND Market_trend_record.date = 最新_record.date;
非常にうまく機能するので、毎週金曜日に Python スクリプトで実行しています。今週のデータを先週のデータと比較するために、2 番目のクエリを作成しました:
market_trend_record.symbol、market_trend_record.date、market_trend_record.trend、を選択します。 Market_trend_record.duration、market_trend_record.price_quote FROM (シンボルを選択、MAX(日付) - 日付として 7 日間の間隔 FROM 市場トレンドレコード GROUP BY シンボル) AS 最新レコード INNER JOIN 市場トレンドレコード ON Market_trend_record.symbol = 最新_record.symbol AND Market_trend_record.date = 最新_レコード.日付;
このアイデアは、利用可能な最後の日付を使用し、7 日を減算して前の週の金曜日を取得することです。これもうまくいきます...うまくいかなくなるまでは。一部のシンボルでは、先週の金曜日のデータが存在しないため、これらのデータセットはスキップされます。たとえば、データ欠落記号の 1 つ:
| 2022-05-31 | FTSE 100 | FTSE | 上昇トレンド | 7 | 44711 | 7607.660156 | | 2022-06-01 | FTSE 100 | FTSE | 上昇トレンド | 8 | 44712 | 7532.950195 | | 2022-06-06 | FTSE 100 | FTSE | 上昇トレンド | 9 | 44717 | 7608.220215 | | 2022-06-07 | FTSE 100 | FTSE | 上昇トレンド | 10 | 44718 | 7598.930176 | | 2022-06-08 | FTSE 100 | FTSE | 上昇トレンド | 11 | 44719 | 7593.000000 | | 2022-06-09 | FTSE 100 | FTSE | 横向き | 1 | 44720 | 7476.209961 | | 2022-06-10 | FTSE 100 | FTSE | 横向き | 2 | 44721 | 7317.520020 |
最後の日付は 2022-06-10 です。上記のクエリによると、1 週間前は 2022-06-03 になりますが、データ セットがありません。
間隔の日付 (上記の例では 2022-06-01) が欠落している場合、利用可能な最後の日付が取得されるように 2 番目のクエリを変更したいと考えています。 上記のクエリのどこに「<=」関係を記述すればよいのかわかりません。日付フィールドでそれが不可能な場合は、整数であるため日付数値を渡すこともできますか?ヒントをいただければ幸いです。
P粉9405389472024-02-27 11:01:49
###可能な解決策:###
SELECT MTR.symbol、MTR.date、MTR.trend、MTR.duration、MTR.price_quote から ( DT.*を選択、 RANK() OVER (PARTITION BY DT.symbol ORDER BY DT.date Desc) レコード番号 マーケットトレンドレコードDTから 内部結合 ( 選択記号、 MAX(日付) - 日付として 7 日間隔 マーケットトレンドレコードから GROUP BY シンボル ) AS DT2 ON DT.symbol = DT2.symbol AND DT.date
魔法のように機能します。 <= DT2.date ) AS MTR WHERE MTR.record_number = 1;