[SQL] SQL 쿼리 : 그룹의 반환 최대 값 기록
SQLSQL 쿼리 : 그룹의 반환 최대 값 기록
아래에 도시 된 바와 같이 I 유사한 구조 및 데이터 샘플 테이블을 가지고
+------+---------+-------------+------------+
| S_ID | S_NAME | SUBJECT | MARK_VALUE |
+------+---------+-------------+------------+
| 1 | Stud | SUB_1 | 50 |
| 2 | Stud | SUB_2 | 60 |
| 3 | Stud | SUB_3 | 70 |
| 4 | Stud_1 | SUB_1 | 40 |
| 5 | Stud_1 | SUB_2 | 50 |
| 6 | Stud_2 | SUB_2 | 40 |
+------+---------+-------------+------------+
표는 학생이 등장하고 각각의 것을 모든 주제에서 각 학생의 통합 된 표시가 있습니다.
다음으로, (관계없이 대상 / 다른 학생의) 각 학생에 의해 얻은 추출물의 최대 마크에 쿼리를 작성, 제발 도와주세요 :
+------+---------+-------------+------------+
| S_ID | S_NAME | SUBJECT | MAX_MARK |
+------+---------+-------------+------------+
| 3 | Stud | SUB_3 | 70 |
| 5 | Stud_1 | SUB_2 | 50 |
| 6 | Stud_2 | SUB_2 | 40 |
+------+---------+-------------+------------+
해결법
-
==============================
1.사용 ROW_NUMBER () 윈도우 함수
사용 ROW_NUMBER () 윈도우 함수
select * from ( select *, row_number()over(partition by s_name order by MARK_VALUE desc) rn from table_name ) t where t.rn=1
또는 당신이 상관 하위 쿼리를 사용할 수 있습니다
select t1.* from table_name t1 where t.MARK_VALUE=(select max(MARK_VALUE) from table_name t2 where t2.S_NAME=t1.S_NAME)
-
==============================
2.분석 기능 ROW_NUMBER는 (즉 행 번호 = 1을 얻는다) 최대 값이 정상에 제기 그래서 내림차순으로 (당신이 학생 당 최대 마크를 얻기 위해 원하는대로) S_NAME으로 그룹 행에 사용하고, 정렬 표시 할 수 있습니다.
분석 기능 ROW_NUMBER는 (즉 행 번호 = 1을 얻는다) 최대 값이 정상에 제기 그래서 내림차순으로 (당신이 학생 당 최대 마크를 얻기 위해 원하는대로) S_NAME으로 그룹 행에 사용하고, 정렬 표시 할 수 있습니다.
그런 다음 행 번호 값을 가진 행을 선택합니다.
SQL> with test (s_id, s_name, subject, mark_value) as 2 (select 1, 'stud', 'sub_1' , 50 from dual union all 3 select 2, 'stud', 'sub_2' , 60 from dual union all 4 select 3, 'stud', 'sub_3' , 70 from dual union all 5 select 4, 'stud_1', 'sub_1', 40 from dual union all 6 select 5, 'stud_1', 'sub_2', 50 from dual union all 7 select 6, 'stud_2', 'sub_2', 40 from dual 8 ) 9 select s_id, s_name, subject, mark_value 10 from (select s_id, s_name, subject, mark_value, 11 row_Number() over (partition by s_name order by mark_value desc) rn 12 from test 13 ) 14 where rn = 1; S_ID S_NAME SUBJE MARK_VALUE ---------- ------ ----- ---------- 3 stud sub_3 70 5 stud_1 sub_2 50 6 stud_2 sub_2 40 SQL>
데이터베이스 버전 분석 기능을 지원하지 않는 경우, 그것은 두 번 같은 테이블에서 선택으로 좋은 아닌 다른 옵션이있다. 테이블에서 많은 행이없는 경우 당신은 차이를 통지하지 않습니다,하지만 성능은 대용량 데이터 세트에 겪게됩니다.
<snip> 9 select s_id, s_name, subject, mark_value 10 from test 11 where (s_name, mark_value) in (select s_name, max(mark_value) max_mark 12 from test 13 group by s_name); S_ID S_NAME SUBJE MARK_VALUE ---------- ------ ----- ---------- 3 stud sub_3 70 5 stud_1 sub_2 50 6 stud_2 sub_2 40 SQL>
-
==============================
3.) (ROW_NUMBER를 사용하여
) (ROW_NUMBER를 사용하여
select * from ( select *,row_number() over(partition by s_name order by MARK_VALUE desc) as rn from tablename )A where rn=1
-
==============================
4.이것을 시도하십시오.
이것을 시도하십시오.
Select B.* from @tbl AS B INNER JOIN( Select S_Name,MAX(MARK_VALUE) AS MARK_VALUE from @tbl Group by S_Name) AS A ON A.S_name=B.S_Name AND A.MARK_VALUE = B.MARK_VALUE
-
==============================
5.다음과 같은 방법으로 그룹을 사용하고 유지할 수 있습니다 :
다음과 같은 방법으로 그룹을 사용하고 유지할 수 있습니다 :
select max(s_id) keep (dense_rank first order by mark desc) as s_id, s_name, max(subject) keep (dense_rank first order by mark desc) as subject, max(max_mark) from t group by s_name;
킵은 집계 함수에 대한 FIRST_VALUE () 및 LAST_VALUE ()와 같은 기능을 허용하는 오라클의 확장입니다. 내 경험에 의하면, 그것은 매우 빠릅니다.
from https://stackoverflow.com/questions/55116179/sql-query-return-max-value-record-of-a-group by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL이 잘못 될 수 있는가? 나는 무엇을보고 있지 않다? (0) | 2020.06.19 |
---|---|
[SQL] PostgreSQL의 열을 찾을 수 없습니다, 그러나 쇼가에 설명 (0) | 2020.06.19 |
[SQL] 오라클 트리거 오류 ORA-04091 (0) | 2020.06.19 |
[SQL] PostgreSQL의에서 카디널리티 추정 오차를 표시하는 쿼리 샘플 (0) | 2020.06.19 |
[SQL] Access 쿼리에서 시작 날짜와 종료 날짜를 사용하여 (0) | 2020.06.19 |