Maison  >  Questions et réponses  >  le corps du texte

Comment éviter le regroupement sur des colonnes spécifiques

<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粉667649253P粉667649253452 Il y a quelques jours426

répondre à tous(1)je répondrai

  • P粉744691205

    P粉7446912052023-07-26 10:58:55

    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.

    répondre
    0
  • Annulerrépondre