[SQL] T-SQL : MAX에 열을 기반으로 선택 (기타 열)
SQLT-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.이 경기, 경우에 배수가 있음을 하위 키 값을 갖는 모든 값을 반환합니다.
이 경기, 경우에 배수가 있음을 하위 키 값을 갖는 모든 값을 반환합니다.
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.아주 간단하게, 아니, 더 하위 쿼리에 가입하지 :
아주 간단하게, 아니, 더 하위 쿼리에 가입하지 :
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.
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.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.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.당신은 항상 한 번에 여러 키에 대해 하나 하나 개 개의 키 값에 대한 행이 아닌 대답을 할 것입니다 경우, 모든 물건이 쓸모 오버 빌딩 조인. 그냥 OMG 조랑말 이미 준 TOP 1 쿼리를 사용합니다.
당신은 항상 한 번에 여러 키에 대해 하나 하나 개 개의 키 값에 대한 행이 아닌 대답을 할 것입니다 경우, 모든 물건이 쓸모 오버 빌딩 조인. 그냥 OMG 조랑말 이미 준 TOP 1 쿼리를 사용합니다.
-
==============================
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
from https://stackoverflow.com/questions/3680254/t-sql-selecting-column-based-on-maxother-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PL / pgSQL의와 PostgreSQL을의 기록으로 여러 필드를 반환 (0) | 2020.04.18 |
---|---|
[SQL] SQL 서버와 SELECT FOR UPDATE (0) | 2020.04.18 |
[SQL] SQL - 쿼리 서버의 IP 주소를 얻을 수 있습니다 (0) | 2020.04.18 |
[SQL] 삽입, 업데이트 SQL Server에서 proc 디렉토리에 저장 (0) | 2020.04.18 |
[SQL] @@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 ID를 검색하는 다른 방법 (0) | 2020.04.18 |