Maison >base de données >tutoriel mysql >Comment récupérer la dernière quantité par ID et horodatage dans Oracle SQL ?
Oracle SQL : Extraire la quantité la plus récente pour chaque ID
Ce guide montre comment récupérer efficacement la dernière quantité pour chaque ID unique à partir d'une table contenant des données horodatées dans Oracle SQL.
L'approche de base implique une stratégie de requêtes imbriquées :
<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>
Cette requête fonctionne comme suit :
Requête interne (ranked_data) : Cette sous-requête utilise la fonction de fenêtre RANK()
pour attribuer un rang à chaque ligne de chaque id
groupe, classé par horodatage (ts
) par ordre décroissant . Le dernier enregistrement pour chaque id
reçoit un rang de 1.
Requête externe : Cette requête filtre les résultats de la requête interne, en sélectionnant uniquement les lignes avec rnk = 1
(les derniers enregistrements). Il regroupe ensuite les résultats par id
et utilise MAX()
pour récupérer l'horodatage et la quantité correspondants. Notez que l'utilisation de MAX(quantity)
avec GROUP BY id
est appropriée en supposant que le dernier horodatage implique également la dernière quantité ; s'il peut y avoir plusieurs lignes avec le même horodatage le plus récent mais des quantités différentes, une méthode d'agrégation différente pourrait être nécessaire (comme FIRST_VALUE
dans une requête plus complexe).
Améliorations :
1. Filtrage basé sur le temps : Pour limiter les résultats à une fenêtre de temps spécifique (par exemple, les XX dernières minutes), ajoutez une clause WHERE
à la requête interne :
<code class="language-sql">WHERE ts >= SYSTIMESTAMP - INTERVAL 'XX' MINUTE</code>
2. Rejoindre une autre table : Pour incorporer des données d'une autre table (par exemple, un id_table
avec des informations d'identification supplémentaires), utilisez un JOIN
dans la requête externe :
<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>
N'oubliez pas de remplacer your_table_name
et id_table
par les noms de vos tables réels. Cette approche raffinée fournit une solution robuste et flexible pour récupérer les données quantitatives les plus récentes dans Oracle SQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!