sql >> Database >  >> RDS >> Mysql

Selecteer rijen met maximale kolomwaarde groep op een andere kolom

Ik heb hier zelf vaak mee geworsteld en de oplossing is om anders over je vraag te denken.

Ik wil elke DocGroupViewID-rij waar de Del_Index de hoogste (max) is voor alle rijen met die 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 
)

Het wordt ingewikkelder wanneer meer dan één rij dezelfde Del_Index . kan hebben , sindsdien heb je een manier nodig om te kiezen welke je wilt laten zien.

EDIT:wilde een andere optie volgen

U kunt de RANK() . gebruiken of ROW_NUMBER() functies met een CTE om meer controle over de resultaten te krijgen, als volgt:

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

Als je manieren hebt om stropdassen op te lossen, voeg deze dan toe aan de ORDER BY .



  1. Duur van gegevens in een globale tijdelijke tabel?

  2. Een database-e-mailaccount bijwerken in SQL Server (T-SQL)

  3. Maak een Postgres-database met python

  4. MySQL zoek exact woord met $ in woord