Oracle SQL: Extrahieren der neuesten Menge für jede ID
Diese Anleitung zeigt, wie Sie die neueste Menge für jede eindeutige ID effizient aus einer Tabelle mit zeitgestempelten Daten in Oracle SQL abrufen können.
Der Kernansatz beinhaltet eine verschachtelte Abfragestrategie:
<code class="language-sql">SELECT id, MAX(ts) AS "DATE", MAX(quantity) AS "QUANTITY" FROM ( SELECT id, ts, RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk, quantity FROM your_table_name ) ranked_data WHERE rnk = 1 GROUP BY id;</code>
Diese Abfrage funktioniert wie folgt:
Innere Abfrage (ranked_data): Diese Unterabfrage verwendet die Fensterfunktion RANK()
, um jeder Zeile innerhalb jeder id
-Gruppe einen Rang zuzuweisen, sortiert nach Zeitstempel (ts
) in absteigender Reihenfolge . Der neueste Datensatz für jeden id
erhält den Rang 1.
Äußere Abfrage: Diese Abfrage filtert die Ergebnisse der inneren Abfrage und wählt nur die Zeilen mit rnk = 1
(die neuesten Datensätze) aus. Anschließend werden die Ergebnisse nach id
gruppiert und mit MAX()
der entsprechende Zeitstempel und die entsprechende Menge abgerufen. Beachten Sie, dass die Verwendung von MAX(quantity)
mit GROUP BY id
angemessen ist, vorausgesetzt, dass der neueste Zeitstempel auch die neueste Menge impliziert; Wenn es mehrere Zeilen mit demselben letzten Zeitstempel, aber unterschiedlichen Mengen geben könnte, ist möglicherweise eine andere Aggregationsmethode erforderlich (wie FIRST_VALUE
in einer komplexeren Abfrage).
Verbesserungen:
1. Zeitbasierte Filterung: Um die Ergebnisse auf ein bestimmtes Zeitfenster (z. B. die letzten XX Minuten) zu beschränken, fügen Sie der inneren Abfrage eine WHERE
-Klausel hinzu:
<code class="language-sql">WHERE ts >= SYSTIMESTAMP - INTERVAL 'XX' MINUTE</code>
2. Mit einer anderen Tabelle verknüpfen: Um Daten aus einer anderen Tabelle einzubeziehen (z. B. ein id_table
mit zusätzlichen ID-Informationen), verwenden Sie ein JOIN
in der äußeren Abfrage:
<code class="language-sql">SELECT id || '-' || idname AS "ID-IDNAME", MAX(ts) AS "DATE", MAX(quantity) AS "QUANTITY" FROM ( SELECT id, ts, RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk, quantity FROM your_table_name ) ranked_data INNER JOIN id_table ON ranked_data.id = id_table.id WHERE rnk = 1 GROUP BY id || '-' || idname;</code>
Denken Sie daran, your_table_name
und id_table
durch Ihre tatsächlichen Tabellennamen zu ersetzen. Dieser verfeinerte Ansatz bietet eine robuste und flexible Lösung zum Abrufen der neuesten Mengendaten in Oracle SQL.
Das obige ist der detaillierte Inhalt vonWie rufe ich die neueste Menge pro ID und Zeitstempel in Oracle SQL ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!