Comment éviter le regroupement sur des colonnes spécifiques
P粉667649253
P粉667649253 2023-07-25 14:08:22
0
1
476
<p>J'ai un tableau de données sur les rendez-vous et lorsque les données associées sont mises à jour, chaque rendez-vous peut avoir plusieurs lignes de données. Je souhaite sélectionner le dernier enregistrement de chaque rendez-vous pour obtenir le dernier instantané de chaque rendez-vous. </p><p>Dans le code ci-joint, je suis obligé de regrouper par close_pallets et close_units, ce qui affecte ce que je vois (c'est-à-dire plusieurs lignes renvoyées par rendez-vous). Je souhaite regrouper uniquement par a.appointment_id pour obtenir une ligne par rendez-vous. Que dois-je faire ?</p><p><br /></p> <pre class="brush:php;toolbar:false;">SELECT MAX(numéro_version_enregistrement_rendez-vous), rendez-vous_id, nomination_pallets AS close_pallets, nomination_units AS close_units DEPUIS b.dh OÙ last_updated_datetime ENTRE '2023-06-01' ET '2023-06-30' ET id_entrepôt = 'xxx' PAR GROUPE rendez-vous_id, close_pallets, close_units</pre> <p><br /></p>
P粉667649253
P粉667649253

répondre à tous(1)
P粉744691205

Vous devrez utiliser une sous-requête pour y parvenir. En fait, vous devez obtenir la version maximale enregistrée de chaque identifiant de rendez-vous :

SELECT
    appointment_record_version_number,
    appointment_id,
    appointment_pallets AS close_pallets,
    appointment_units AS close_units
FROM
    b.dh AS t1
WHERE
    t1.appointment_record_version_number = (
        SELECT
            MAX(appointment_record_version_number)
        FROM
            b.dh
        WHERE
            b.dh.data = t1.data
    )
    AND last_updated_datetime BETWEEN '2023-06-01' AND '2023-06-30'
    AND warehouse_id = 'xxx'

Vous pouvez également utiliser une instruction JOIN pour sélectionner la valeur maximale, ce qui est parfois plus rapide :

SELECT
    t1.appointment_record_version_number,
    t1.appointment_id,
    t1.appointment_pallets AS close_pallets,
    t1.appointment_units AS close_units
FROM
    b.dh AS t1
LEFT JOIN b.dh AS t2 ON (
    t1.appointment_record_version_number = t2.appointment_record_version_number
    AND t1.appointment_id < t2.appointment_id
)
WHERE t2.appointment_record_version_number IS NULL
AND last_updated_datetime BETWEEN '2023-06-01' AND '2023-06-30'
AND warehouse_id = 'xxx';

En fonction de votre cas d'utilisation, surtout si votre base de données est volumineuse, vous pouvez utiliser des sous-requêtes ou des index supplémentaires pour optimiser davantage la requête, mais c'est déjà assez rapide.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal