sql >> Databasteknik >  >> RDS >> Mysql

Välj rader med maximalt kolumnvärde grupp efter annan kolumn

Jag har själv kämpat med detta många gånger och lösningen är att tänka på din fråga annorlunda.

Jag vill ha varje DocGroupViewID-rad där Del_Index är det högsta (max) för alla rader med det 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 
)

Det blir mer komplext när mer än en rad kan ha samma Del_Index , sedan dess behöver du något sätt att välja vilken du vill visa.

EDIT:ville följa upp med ett annat alternativ

Du kan använda RANK() eller ROW_NUMBER() fungerar med en CTE för att få mer kontroll över resultaten, enligt följande:

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

Om du har sätt att reda ut band, lägg bara till det i ORDER BY .



  1. Oracle JDBC intermittent anslutningsproblem

  2. Hur man ersätter (null) värden med 0 utgång i PIVOT

  3. Hur man tar bort en kolumn från en tabell i MySQL

  4. Kan jag göra en mysql Select, Update and Delete i en fråga?