MySQL: Ruft den Datensatz für ein bestimmtes Datum ab – den letzten vorhandenen Datensatz davor, falls noch keiner vorhanden ist
P粉614840363
P粉614840363 2024-02-26 18:44:20
0
1
426

Mein Tabellenaufbau ist wie folgt:

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`));

Um den neuesten Eintrag für jedes Symbol zu erhalten (aufgrund nationaler Feiertage handelt es sich nicht unbedingt um dasselbe Datum), mache ich Folgendes:

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;

Es funktioniert so gut, dass ich es jeden Freitag über ein Python-Skript laufen lasse. Um nun die Daten dieser Woche mit den Daten der letzten Woche zu vergleichen, habe ich eine zweite Abfrage erstellt:

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;

Die Idee besteht darin, das letzte verfügbare Datum zu verwenden und 7 Tage abzuziehen, um den Freitag der letzten Woche zu erhalten. Das funktioniert auch gut ... bis es nicht mehr funktioniert. Für einige Symbole sind keine Daten für den letzten Freitag vorhanden, daher werden diese Datensätze übersprungen. Zum Beispiel eines der fehlenden Datensymbole:

| 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 |

Das letzte Datum ist der 10.06.2022, und laut der obigen Abfrage ist das eine Woche frühere der 03.06.2022, es gibt jedoch keinen Datensatz.

Ich möchte die zweite Abfrage so ändern, dass bei fehlendem Intervalldatum (im Beispiel oben 01.06.2022) das letzte verfügbare Datum verwendet wird. Ich weiß nicht, wo ich die Beziehung „<=“ in der obigen Abfrage einfügen soll. Wenn das bei Datumsfeldern nicht möglich ist, übergeben Sie vielleicht Datumszahlen, da es sich um Ganzzahlen handelt? Für jeden Tipp wäre ich sehr dankbar!

P粉614840363
P粉614840363

Antworte allen(1)
P粉940538947

可能的解决方案:

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 

就像魅力一样。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage