programing

T-SQL: MAX를 기반으로 컬럼 선택(기타 컬럼)

closeapi 2023. 10. 13. 22:14
반응형

T-SQL: MAX를 기반으로 컬럼 선택(기타 컬럼)

하위 쿼리를 사용하지 않고 간단한 방법이 있으면 좋겠습니다.

시나리오:"키", "서브키" 및 "값" 열이 있는 "표 A"가 있습니다.주어진 "Key"에 대한 MAX("SubKey")의 "Value"를 구해야 합니다.

따라서 표에 행이 포함되어 있는 경우:

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

Key = 1의 경우 300 값이 필요합니다.저는 이런 일을 하고 싶었습니다.

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

하지만 그건 절대 안돼요.'WHERE SubKey = (max subkey의 경우 subselect)'를 수행하지 않고 이를 수행할 수 있는 방법이 있습니까?

셀프 조인 사용:

이렇게 하면 여러 개일 경우 일치하는 하위 키 값이 있는 모든 값이 반환됩니다.

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

RANK & CTE(SQL Server 2005+) 사용:

이렇게 하면 여러 개일 경우 일치하는 하위 키 값이 있는 모든 값이 반환됩니다.

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

ROW_NUMBER & CTE(SQL Server 2005+) 사용:

이렇게 하면 동일한 하위 키 값을 가진 행이 하나 이상 있더라도 하나의 행을 반환합니다.

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

TOP 사용:

이렇게 하면 동일한 하위 키 값을 가진 행이 하나 이상 있더라도 하나의 행을 반환합니다.

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

매우 간단하며, 가입, 하위 쿼리 없음:

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

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

T2.key가 NULL이 되는 유일한 시간은 LEFT JOIN에 일치하는 항목이 없을 때이며, 이는 더 높은 하위 키를 가진 행이 존재하지 않음을 의미합니다.동일한(가장 높은) 하위 키를 가진 행이 여러 개 있는 경우 여러 행을 반환합니다.

OMG 포니즈ROW_NUMBERmethod는 2개의 경우에도 실패하지 않기 때문에 모든 시나리오에서 가장 잘 작동하는 방법입니다.MAX동일한 양의 값이 예상보다 많은 레코드를 반환하고 그 값에 의해 공급되었을 수 있는 가능한 삽입을 깨트립니다.recordset.

누락된 한 가지는 키가 여러 개일 때 각 최대값에 연결된 하위 키를 반환해야 하는 경우의 방법입니다.가입만 하면 됩니다.summary가 있는 테이블MIN그리고.GROUP"itself"하고 나가요

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

한 번에 많은 키에 대한 답이 아니라 항상 하나의 키 값에 대해 하나의 행만 원하는 경우, 모든 조인 항목은 불필요한 오버빌딩입니다.OMG 포니즈가 이미 제공한 TOP 1 쿼리만 사용하면 됩니다.

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

"first_value"보다 빠를 수 있음:

select distinct on ("Key") "Key", "Value"
from tablea
order by "Key", "SubKey" desc 

언급URL : https://stackoverflow.com/questions/3680254/t-sql-selecting-column-based-on-maxother-column

반응형