복붙노트

[SQL] SQL 쿼리 : 그룹의 반환 최대 값 기록

SQL

SQL 쿼리 : 그룹의 반환 최대 값 기록

아래에 도시 된 바와 같이 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. ==============================

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

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

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

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

    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 ()와 같은 기능을 허용하는 오라클의 확장입니다. 내 경험에 의하면, 그것은 매우 빠릅니다.

  6. from https://stackoverflow.com/questions/55116179/sql-query-return-max-value-record-of-a-group by cc-by-sa and MIT license