Rumah  >  Soal Jawab  >  teks badan

MySQL: Dapatkan set data untuk tarikh tertentu - set data sedia ada terakhir sebelum ini jika tidak wujud

Struktur meja saya adalah seperti berikut:

CREATE TABLE `market_trend_record` (
`date` date NOT NULL,
`symbol` CHAR(40),
`identifier` CHAR(20),
`trend` CHAR(9),
`duration` int,
`daynr` int,
`price_quote` decimal(16,6),
PRIMARY KEY (`date` , `symbol` , `identifier`));

Untuk mendapatkan entri terkini bagi setiap simbol (tidak semestinya tarikh yang sama kerana cuti kebangsaan), saya lakukan ini:

SELECT market_trend_record.symbol, market_trend_record.date, market_trend_record.trend, 
market_trend_record.duration, market_trend_record.price_quote 
    FROM (select symbol, MAX(date) 
       AS date FROM market_trend_record GROUP BY symbol) AS latest_record INNER JOIN 
       market_trend_record ON market_trend_record.symbol = latest_record.symbol AND 
       market_trend_record.date = latest_record.date;

Ia berfungsi dengan baik sehingga saya menjalankannya melalui skrip python setiap hari Jumaat. Sekarang untuk membandingkan data minggu ini dengan data minggu lepas, saya membuat pertanyaan kedua:

select market_trend_record.symbol, market_trend_record.date, market_trend_record.trend, 
market_trend_record.duration, market_trend_record.price_quote FROM (select symbol, MAX(date) - 
INTERVAL 7 DAY AS date 
    FROM market_trend_record GROUP BY symbol) AS latest_record INNER JOIN market_trend_record 
    ON market_trend_record.symbol = latest_record.symbol AND market_trend_record.date = 
    latest_record.date;

Ideanya adalah untuk menggunakan tarikh terakhir yang tersedia dan tolak 7 hari untuk mendapatkan Jumaat minggu lepas. Ini juga berfungsi dengan baik...sehingga tidak. Untuk sesetengah simbol, data untuk Jumaat lepas tidak wujud, jadi set data ini dilangkau. Contohnya salah satu simbol data yang tiada:

| 2022-05-31 | FTSE 100 | FTSE       | uptrend   |        7 | 44711 | 7607.660156 |
| 2022-06-01 | FTSE 100 | FTSE       | uptrend   |        8 | 44712 | 7532.950195 |
| 2022-06-06 | FTSE 100 | FTSE       | uptrend   |        9 | 44717 | 7608.220215 |
| 2022-06-07 | FTSE 100 | FTSE       | uptrend   |       10 | 44718 | 7598.930176 |
| 2022-06-08 | FTSE 100 | FTSE       | uptrend   |       11 | 44719 | 7593.000000 |
| 2022-06-09 | FTSE 100 | FTSE       | sideways  |        1 | 44720 | 7476.209961 |
| 2022-06-10 | FTSE 100 | FTSE       | sideways  |        2 | 44721 | 7317.520020 |

Tarikh terakhir ialah 2022-06-10, dan mengikut pertanyaan di atas, seminggu lebih awal ialah 2022-06-03, tetapi tiada set data.

Saya ingin mengubah suai pertanyaan kedua dengan cara yang jika tarikh selang tiada (2022-06-01 dalam contoh di atas), ia akan mengambil tarikh terakhir yang tersedia. Saya tidak tahu di mana hendak meletakkan hubungan "<=" dalam pertanyaan di atas. Jika itu tidak boleh dilakukan dengan medan tarikh, mungkin lulus nombor tarikh kerana ia adalah integer? Sebarang petua akan sangat dihargai!

P粉614840363P粉614840363235 hari yang lalu400

membalas semua(1)saya akan balas

  • P粉940538947

    P粉9405389472024-02-27 11:01:49

    Penyelesaian yang mungkin:

    SELECT MTR.symbol, MTR.date, MTR.trend, MTR.duration, MTR.price_quote
    FROM (
        SELECT DT.*,
               RANK() OVER (PARTITION BY DT.symbol ORDER BY DT.date Desc) record_number
        FROM market_trend_record DT
        INNER JOIN (
            SELECT symbol,
            MAX(date) - INTERVAL 7 DAY AS date
            FROM market_trend_record
            GROUP BY symbol
        ) AS DT2 ON DT.symbol = DT2.symbol AND DT.date <= DT2.date
    ) AS MTR
    WHERE MTR.record_number = 1;

    Berfungsi seperti azimat.

    balas
    0
  • Batalbalas