복붙노트

[SQL] T-SQL : MAX에 열을 기반으로 선택 (기타 열)

SQL

T-SQL : MAX에 열을 기반으로 선택 (기타 열)

나는 하위 쿼리를 사용하지 않고이 작업을 수행 할 수있는 간단한 방법이 바라고 있어요 :

시나리오 : 당신은 열 "키"와 "TableA의", "하위 키"및 "가치"가. 나는 주어진 "키"의 MAX의 "값"( "하위")을 얻을 필요가있다.

테이블 행을 포함한다면 :

KEY SUBKEY VALUE
1   1      100
1   2      200
1   3      300

키 = 1의 경우, 나는 이런 식으로 뭔가를 기대했다 (300) 값이 필요합니다 :

SELECT
  VALUE
FROM
  TableA
WHERE
  Key = 1
HAVING
  SubKey = MAX(SubKey)

그러나 그것은 노 이동 없습니다. 는 '하위 키 = (최대 하위 키 부속)을'일을하지 않고 할 수있는 방법이 있나요?

해결법

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

    1.이 경기, 경우에 배수가 있음을 하위 키 값을 갖는 모든 값을 반환합니다.

    이 경기, 경우에 배수가 있음을 하위 키 값을 갖는 모든 값을 반환합니다.

    SELECT a.value
      FROM TABLE a
      JOIN (SELECT MAX(t.subkey) AS max_subkey
              FROM TABLE t
             WHERE t.key = 1) b ON b.max_subkey = a.subkey
     WHERE a.key = 1
    

    이 경기, 경우에 배수가 있음을 하위 키 값을 갖는 모든 값을 반환합니다.

    WITH summary AS (
      SELECT t.*,
             RANK() OVER(ORDER BY t.subkey DESC) AS rank
        FROM TABLE t
       WHERE t.key = 1)
    SELECT s.value
      FROM summary s
     WHERE s.rank = 1
    

    더 같은 하위 키 값을 하나 이상이있는 경우에도 이것은 하나 개의 행을 반환합니다 ...

    WITH summary AS (
      SELECT t.*,
             ROW_NUMBER() OVER(ORDER BY t.subkey DESC) AS rank
        FROM TABLE t
       WHERE t.key = 1)
    SELECT s.value
      FROM summary s
     WHERE s.rank = 1
    

    더 같은 하위 키 값을 하나 이상이있는 경우에도 이것은 하나 개의 행을 반환합니다 ...

      SELECT TOP 1
             t.value
        FROM TABLE t
       WHERE t.key = 1
    ORDER BY t.subkey DESC
    
  2. ==============================

    2.아주 간단하게, 아니, 더 하위 쿼리에 가입하지 :

    아주 간단하게, 아니, 더 하위 쿼리에 가입하지 :

    SELECT FIRST_VALUE(Value) OVER (ORDER BY SubKey DESC)
    FROM TableA
    WHERE Key = 1
    

    각 키에 대한 최대 값을해야하는 경우 :

    SELECT DISTINCT Key, 
    FIRST_VALUE(Value) OVER (PARTITION BY Key ORDER BY SubKey DESC)
    FROM TableA
    
  3. ==============================

    3.

    SELECT MAX(Value)
    FROM TableA t1
    GROUP BY Key, SubKey
    HAVING SubKey = (SELECT MAX(SubKey) FROM TableA t2 WHERE t1.Key = t2.Key)
      AND Key = 1
    
  4. ==============================

    4.OMG 조랑말을 수행하는 방법의 대부분을했다. 여기에 하나 더있다 :

    OMG 조랑말을 수행하는 방법의 대부분을했다. 여기에 하나 더있다 :

    SELECT
        T1.value
    FROM
        My_Table T1
    LEFT OUTER JOIN My_Table T2 ON
        T2.key = T1.key AND
        T2.subkey > T1.subkey
    WHERE
        T2.key IS NULL
    

    왼쪽에 일치하는 어떤 행이 높은 하위 키에 존재하지 않음을하는 수단이 JOIN 없을 때 T2.key이 NULL이 될 것이다 유일한 시간이다. 같은 (최고) 하위 키와 여러 행이있는 경우이 여러 행을 반환합니다.

  5. ==============================

    5.OMG Ponie의 ROW_NUMBER 방법은 예상보다 더 많은 기록을 반환 같은 양의 두 MAX 값을 갖는하고 해당 레코드에 의해 공급되는 수도 가능한 인서트를 깨는의 경우에 실패하지 않습니다 모든 시나리오에 가장 적합한 하나입니다.

    OMG Ponie의 ROW_NUMBER 방법은 예상보다 더 많은 기록을 반환 같은 양의 두 MAX 값을 갖는하고 해당 레코드에 의해 공급되는 수도 가능한 인서트를 깨는의 경우에 실패하지 않습니다 모든 시나리오에 가장 적합한 하나입니다.

    없는 것은 또한 여러 개의 키가있는 경우, 각각의 최대 값에 관련된 하위 키를 반환해야하는 경우에 그것을 수행하는 방법이다. 단순히 MIN 및 GROUP "그 자체"로 요약 테이블을 가입하고 당신이 가고 끕니다.

    WITH summary AS (
      SELECT t.*,
             ROW_NUMBER() OVER(ORDER BY t.subkey DESC) AS rank
        FROM TABLE t
       WHERE t.key = 1)
    SELECT s.*
      FROM summary s
      join  (select key, min(rank) as rank
            from summary
            group by key) sMAX
            on s.key = sMAX.key and r.rank = sMAX.rank
    
  6. ==============================

    6.당신은 항상 한 번에 여러 키에 대해 하나 하나 개 개의 키 값에 대한 행이 아닌 대답을 할 것입니다 경우, 모든 물건이 쓸모 오버 빌딩 조인. 그냥 OMG 조랑말 이미 준 TOP 1 쿼리를 사용합니다.

    당신은 항상 한 번에 여러 키에 대해 하나 하나 개 개의 키 값에 대한 행이 아닌 대답을 할 것입니다 경우, 모든 물건이 쓸모 오버 빌딩 조인. 그냥 OMG 조랑말 이미 준 TOP 1 쿼리를 사용합니다.

  7. ==============================

    7.CTE를 사용하여 여러 키의 경우 :

    CTE를 사용하여 여러 키의 경우 :

    WITH CTE AS
    (
        SELECT key1, key2, MAX(subkey) AS MaxSubkey
        FROM TableA 
        GROUP BY key1, key2
    )
    SELECT a.Key1, a.Key2, a.Value
    FROM TableA a
        INNER JOIN CTE ON a.key1 = CTE.key1 AND a.key2 = CTE.key2 AND
                          a.subkey = CTE.MaxSubkey
    
  8. from https://stackoverflow.com/questions/3680254/t-sql-selecting-column-based-on-maxother-column by cc-by-sa and MIT license