Mysql
 sql >> база данни >  >> RDS >> Mysql

Изберете група редове с максимална стойност на колона от друга колона

Самият аз съм се борил с това много пъти и решението е да мислим за вашата заявка по различен начин.

Искам всеки ред на DocGroupViewID, където Del_Index е най-високият (макс.) за всички редове с този 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 
)

Става по-сложно, когато повече от един ред може да има един и същ Del_Index , оттогава имате нужда от някакъв начин да изберете кой да покажете.

РЕДАКТИРАНЕ:исках да последвам с друга опция

Можете да използвате RANK() или ROW_NUMBER() функционира с CTE, за да получите повече контрол върху резултатите, както следва:

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

Ако имате начини да подредите връзките, просто го добавете към 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. Как да премахнете крайния празен интервал в MySQL

  2. Mysql присъединяване и сумата е удвояване резултат

  3. UNIX_TIMESTAMP() Примери – MySQL

  4. Излагане на име на таблица и имена на полета в URL адреса на заявката

  5. Как да използвам потребителски променливи в клаузата LIKE на MySQL?