Heim  >  Fragen und Antworten  >  Hauptteil

So vermeiden Sie die Gruppierung nach bestimmten Spalten

<p>Ich habe eine Datentabelle zu Terminen und wenn die zugehörigen Daten aktualisiert werden, kann jeder Termin mehrere Datenzeilen haben. Ich möchte den letzten Datensatz jedes Termins auswählen, um den neuesten Schnappschuss jedes Termins zu erhalten. </p><p>Im angehängten Code bin ich gezwungen, nach close_pallets und close_units zu gruppieren, was sich auf das auswirkt, was ich sehe (d. h. mehrere zurückgegebene Zeilen pro Termin). Ich möchte nur nach a.appointment_id gruppieren, damit ich eine Zeile pro Termin erhalte. Was soll ich tun?</p><p><br /></p> <pre class="brush:php;toolbar:false;">SELECT MAX(appointment_record_version_number), termine_id, date_pallets AS close_pallets, date_units AS close_units AUS b.dh WO last_updated_datetime ZWISCHEN „01.06.2023“ UND „30.06.2023“ UND Warehouse_id = 'xxx' GRUPPIERE NACH termine_id, close_pallets, close_units</pre> <p><br /></p>
P粉667649253P粉667649253452 Tage vor428

Antworte allen(1)Ich werde antworten

  • P粉744691205

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

    您将需要使用子查询来实现这一点。实际上,您需要获取每个约会ID的最大记录版本:

    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'
    

    你也可以使用JOIN语句来选择最大值,有时会更快:

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

    根据您的用例,特别是如果您的数据库很大,您可以使用其他子查询或索引来进一步优化请求,但它已经相当快了。

    Antwort
    0
  • StornierenAntwort