cari

Rumah  >  Soal Jawab  >  teks badan

SQL pilih hanya baris dengan nilai maksimum pada lajur

<p>Saya mempunyai borang dokumen ini (di sini ialah versi ringkas): </p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>Pemindahan</th> <th>Kandungan</th> </tr> </kepala> <tbody> <tr> <td>1</td> <td>1</td> <td>...</td> </tr> <tr> <td>2</td> <td>1</td> <td>...</td> </tr> <tr> <td>1</td> <td>2</td> <td>...</td> </tr> <tr> <td>1</td> <td>3</td> <td>...</td> </tr> </tbody> </table> <p>Bagaimana untuk memilih satu baris setiap ID dan hanya RPM terbesar? </p><p> Menggunakan data di atas, hasilnya harus mengandungi dua baris: <code>[1, 3, ...]</code> dan <code>[2, ​​​​1, ..]</code> . Saya menggunakan<em><strong>MySQL</strong></em>. </p> <p>Pada masa ini, saya menggunakan semakan dalam <kod>semasa</kod> gelung untuk mengesan dan menulis ganti rev lama dalam set hasil. Tetapi adakah ini satu-satunya cara untuk mencapai keputusan ini? Tidak mempunyai <strong>SQL</strong> </p>
P粉937382230P粉937382230517 hari yang lalu457

membalas semua(2)saya akan balas

  • P粉638343995

    P粉6383439952023-08-24 09:47:12

    Keutamaan saya adalah menggunakan kod sesedikit mungkin...

    Anda boleh melakukan ini menggunakan IN Cuba ini:

    SELECT * 
    FROM t1 WHERE (id,rev) IN 
    ( SELECT id, MAX(rev)
      FROM t1
      GROUP BY id
    )

    Pada pendapat saya, ia kurang kompleks... lebih mudah dibaca dan diselenggara.

    balas
    0
  • P粉517475670

    P粉5174756702023-08-24 09:16:15

    Sepintas lalu...

    Apa yang anda perlukan hanyalah klausa dengan MAX 聚合函数的 GROUP BY:

    SELECT id, MAX(rev)
    FROM YourTable
    GROUP BY id

    Perkara tidak pernah semudah itu, bukan?

    Saya baru perasan bahawa anda juga memerlukan content lajur.

    Ini adalah masalah yang sangat biasa dalam SQL: cari semua data untuk baris dengan beberapa nilai maksimum dalam setiap lajur pengecam kumpulan. Saya sering mendengar kenyataan ini dalam kerjaya saya. Sebenarnya, ini adalah salah satu soalan yang saya jawab dalam temuduga teknikal di tempat kerja saya sekarang.

    Malah, komuniti Stack Overflow mencipta teg untuk mengendalikan soalan seperti ini: .

    Pada asasnya, anda mempunyai dua cara untuk menyelesaikan masalah ini:

    Guna mudah group-identifier, max-value-in-groupsubquery join

    Dalam pendekatan ini anda mula-mula mencari group-identifier, max-value-in-group(上面已解决)。然后,将表连接到子查询,并在 group-identifiermax-value-in-group dalam subkueri (diselesaikan di atas). Kemudian, sertai jadual ke subkueri dan jadikan ia sama pada

    dan maks-nilai-dalam-kumpulan:

    SELECT a.id, a.rev, a.contents
    FROM YourTable a
    INNER JOIN (
        SELECT id, MAX(rev) rev
        FROM YourTable
        GROUP BY id
    ) b ON a.id = b.id AND a.rev = b.rev

    Kiri bergabung dengan diri sendiri, laraskan syarat serta penapis

    group-identifierDalam kaedah ini anda meninggalkan sertai jadual dengan dirinya sendiri. Kesaksamaan wujud dalam

    . Kemudian, 2 langkah bijak:
    1. Syarat sambungan kedua ialah nilai di sebelah kiri kurang daripada nilai di sebelah kanan
    2. NULL(这是一个 LEFT JOINApabila anda melakukan langkah 1, baris yang sebenarnya mempunyai nilai terbesar akan ditunjukkan di sebelah kanan
    3. , ingat? ). Kami kemudian menapis hasil gabungan untuk hanya menunjukkan baris dengan NULL di sebelah kanan.

    Jadi anda akan mendapat:

    SELECT a.*
    FROM YourTable a
    LEFT OUTER JOIN YourTable b
        ON a.id = b.id AND a.rev < b.rev
    WHERE b.id IS NULL;

    Kesimpulan

    Kedua-dua kaedah akan membawa hasil yang sama.

    group-identifier 具有 max-value-in-groupJika anda mempunyai dua baris

    dengan nilai-maks-dalam-kumpulan, kedua-dua baris akan muncul dalam hasil kedua-dua kaedah.

    Kedua-dua kaedah ini serasi dengan SQL ANSI, jadi ia akan berfungsi dengan RDBMS kegemaran anda tanpa mengira "rasa"nya.

    Kedua-dua pendekatan juga mesra prestasi, tetapi situasi anda mungkin berbeza (RDBMS, struktur pangkalan data, indeks, dll.). Jadi apabila anda memilih satu kaedah berbanding kaedah yang lain, Tanda Aras

    . Dan pastikan anda memilih yang paling sesuai untuk anda. 🎜

    balas
    0
  • Batalbalas