検索

ホームページ  >  に質問  >  本文

MySQL: 指定された日付のデータセットを取得します。存在しない場合は、これより前の最後の既存のデータセットを取得します。

私のテーブル構造は次のとおりです:

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粉614840363P粉614840363324日前460

全員に返信(1)返信します

  • P粉940538947

    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;

    返事
    0
  • キャンセル返事