Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie die Gruppe Zeilen mit maximalem Spaltenwert nach einer anderen Spalte aus

Ich habe selbst oft damit gekämpft und die Lösung besteht darin, anders über Ihre Anfrage nachzudenken.

Ich möchte jede DocGroupViewID-Zeile, in der der Del_Index für alle Zeilen mit dieser DocGroupViewID am höchsten (maximal) ist:

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 
)

Komplizierter wird es, wenn mehr als eine Zeile denselben Del_Index haben kann , seitdem müssen Sie eine Möglichkeit auswählen, welche angezeigt werden soll.

EDIT:wollte mit einer anderen Option weitermachen

Sie können den RANK() verwenden oder ROW_NUMBER() Funktionen mit einem CTE, um mehr Kontrolle über die Ergebnisse zu erhalten, wie folgt:

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

Wenn Sie Möglichkeiten haben, Bindungen zu sortieren, fügen Sie sie einfach zu ORDER BY hinzu .