sql >> Databáze >  >> RDS >> Mysql

Vyberte skupinu řádků s maximální hodnotou sloupce podle jiného sloupce

Sám jsem s tím mnohokrát bojoval a řešením je přemýšlet o svém dotazu jinak.

Chci každý řádek DocGroupViewID, kde je Del_Index nejvyšší (max) pro všechny řádky s tímto DocGroupViewID:

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 
)

Je to složitější, když více než jeden řádek může mít stejný Del_Index , od té doby potřebujete nějaký způsob, jak vybrat, který z nich se zobrazí.

UPRAVIT:chtěl jsem navázat další možností

Můžete použít RANK() nebo ROW_NUMBER() funguje s CTE, abyste získali větší kontrolu nad výsledky, a to následovně:

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

Pokud máte způsoby, jak spojit vazby, přidejte je do ORDER BY .



  1. Digitální transformace:Vše začíná uvažováním dat

  2. Jak vytvořit sekvenci Oracle začínající maximální hodnotou z tabulky?

  3. jak provést uloženou proceduru v SQL Developer?

  4. MySQL:řazení podle uvnitř skupiny podle