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_NUMBER
method는 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
'programing' 카테고리의 다른 글
나는 C의 malloc()와 calloc()에 대해 매우 혼란스럽습니다. (0) | 2023.10.13 |
---|---|
MariaDB - JSON 필드에서 Store 값으로 필드 값을 설정하는 방법 (0) | 2023.10.13 |
html을 사용하여 여러 줄로 된 텍스트 상자를 만듭니다.도우미기능 (0) | 2023.10.13 |
gdb: 현재 컨텍스트에 기호 "i"가 없습니다. (0) | 2023.10.13 |
AWS Elasticache Redis 클러스터를 Spring Boot 앱에 연결하는 방법은? (0) | 2023.10.13 |