Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz wiersze z maksymalną wartością kolumny według innej kolumny

Sam zmagałem się z tym wiele razy i rozwiązaniem jest inne podejście do zapytania.

Chcę każdy wiersz DocGroupViewID, w którym Del_Index jest najwyższy (maks.) dla wszystkich wierszy z tym 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 
)

Sprawa staje się bardziej złożona, gdy więcej niż jeden wiersz może mieć ten sam Del_Index , od tego czasu potrzebujesz sposobu, aby wybrać, który z nich chcesz pokazać.

EDIT:chciałem kontynuować z inną opcją

Możesz użyć RANK() lub ROW_NUMBER() działa z CTE, aby uzyskać większą kontrolę nad wynikami, w następujący sposób:

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

Jeśli masz sposoby na uporządkowanie powiązań, po prostu dodaj je do 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. Jak zbudować nieograniczony poziom menu za pomocą PHP i mysql

  2. MySQL EXPLAIN 'typ' zmienia się z 'zakres' na 'ref' po zmianie daty w instrukcji where?

  3. Sumuj wartości tablicy wielowymiarowej według klucza bez pętli

  4. Policzyć liczbę wystąpień ciągu w polu VARCHAR?

  5. Jak wstawić wartości do tabeli z dynamicznymi kolumnami Jdbc/Mysql