Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pilih Baris dengan Grup Nilai Kolom Maksimum dengan Kolom Lain

Saya sendiri telah berjuang dengan ini berkali-kali dan solusinya adalah memikirkan kueri Anda secara berbeda.

Saya ingin setiap baris DocGroupViewID di mana Del_Index adalah yang tertinggi (maks) untuk semua baris dengan DocGroupViewID itu:

SELECT
    T.DocGroupViewID,
    T.Del_Index,
    T.ID
FROM MyTable T
WHERE T.Del_Index = (
    SELECT MAX( T1.Del_Index ) FROM MyTable T1
    WHERE T1.DocGroupViewID = T.DocGroupViewID 
)

Ini menjadi lebih kompleks ketika lebih dari satu baris dapat memiliki Del_Index yang sama , sejak itu Anda memerlukan beberapa cara untuk memilih mana yang akan ditampilkan.

EDIT:ingin menindaklanjuti dengan opsi lain

Anda dapat menggunakan RANK() atau ROW_NUMBER() berfungsi dengan CTE untuk mendapatkan kontrol lebih besar atas hasil, sebagai berikut:

-- fake a source table
DECLARE @t TABLE (
    ID int IDENTITY(1,1) PRIMARY KEY,
    Del_Index int,
    DocGroupViewID int
)

INSERT INTO @t
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 1, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 2, 2 UNION ALL
SELECT 1, 3 UNION ALL
SELECT 2, 3 UNION ALL
SELECT 3, 3 UNION ALL
SELECT 4, 3

-- show our source
SELECT * FROM @t

-- select using RANK (can have duplicates)
;WITH cteRank AS
(
    SELECT
        DocGroupViewID,
        Del_Index,
        ID,
        RANK() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowRank,
        ROW_NUMBER() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowNumber
    FROM @t
)
SELECT *
FROM cteRank
WHERE RowRank = 1

-- select using ROW_NUMBER
;WITH cteRowNumber AS
(
    SELECT
        DocGroupViewID,
        Del_Index,
        ID,
        RANK() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowRank,
        ROW_NUMBER() OVER
            (PARTITION BY DocGroupViewID ORDER BY Del_Index DESC)
        AS RowNumber
    FROM @t
)
SELECT *
FROM cteRowNumber
WHERE RowNumber = 1

Jika Anda memiliki cara untuk memilah ikatan, tambahkan saja ke ORDER BY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. koneksi database tunggal php, apakah kode ini praktik yang buruk?

  2. GALAT 2003 (HY000):Tidak dapat terhubung ke server MySQL di '127.0.0.1' (111)

  3. FindByUUID() menggunakan Repositori JPA Spring Data

  4. Laravel:pesan di mana di

  5. Apa praktik terbaik untuk menyimpan data khusus untuk Wordpress