복붙노트

[SQL] 또 다른 열을 기준으로 최대 열 값 그룹과 행 선택

SQL

또 다른 열을 기준으로 최대 열 값 그룹과 행 선택

이 간단한 질문해야하지만, 나는 일에 그것을 얻을 수 없습니다 :(

어떻게 다른 열을 기준으로 그룹으로 최대 열 값이 행을 선택하려면?

예를 들어,

나는 다음과 같은 테이블 정의가 :

ID
Del_Index
docgroupviewid

문제는 지금은 처음 docgroupviewid에 의한 결과로 그룹화 할 다음 하나는 가장 높은 del_index을 가지고에 따라, 각 docgroupviewid 그룹에서 하나 개의 행을 선택하는 것입니다.

나는 시도

SELECT docgroupviewid, max(del_index),id FROM table
group by docgroupviewid

그러나이 같은 docgroupviewid와 그룹에서 최초의 ID로 저를 반환 올바른 ID로 나를 돌아 대신.

어떤 아이디어?

해결법

  1. ==============================

    1.나 자신이 여러 번 고생 한 용액을 다른 쿼리에 대해 생각하는 것입니다.

    나 자신이 여러 번 고생 한 용액을 다른 쿼리에 대해 생각하는 것입니다.

    그 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
    

    당신이 관계를 분류 할 수있는 방법이 있다면, 바로 BY 순서에 추가합니다.

  2. ==============================

    2.당신은 당신의 쿼리 조금 복잡 할 것이다 :

    당신은 당신의 쿼리 조금 복잡 할 것이다 :

    select a.docgroupviewid, a.del_index, a.id from table a
        where a.del_index = (select max(b.del_index) from table
            where b.docgroupviewid = a.docgroupviewid)
    
  3. from https://stackoverflow.com/questions/1425240/select-rows-with-maximum-column-value-group-by-another-column by cc-by-sa and MIT license