복붙노트

[SQL] SQL에서 어떻게 각 그룹의 상위 2 행을 선택합니다

SQL

SQL에서 어떻게 각 그룹의 상위 2 행을 선택합니다

나는 다음과 같은 테이블이 있습니다 :

NAME    SCORE
-----------------
willy       1
willy       2
willy       3
zoe         4
zoe         5
zoe         6

다음은 샘플입니다

만에 의해 그룹의 집계 함수 나 각 이름에 대한 높은 점수를 얻을 수 있습니다. 내가 어떻게해야합니까, 각 이름에 대한 가장 높은 두 점수를 얻을 수있는 쿼리를하고 싶습니다?

내 예상 출력은

NAME    SCORE
-----------------
willy       2
willy       3
zoe         5
zoe         6

해결법

  1. ==============================

    1.

    SELECT *
    FROM   test s
    WHERE 
            (
                SELECT  COUNT(*) 
                FROM    test  f
                WHERE f.name = s.name AND 
                      f.score >= s.score
            ) <= 2
    
  2. ==============================

    2.MySQL의에서 각 그룹의 행 번호를 얻기 위해 사용자 정의 변수를 사용할 수 있습니다 :

    MySQL의에서 각 그룹의 행 번호를 얻기 위해 사용자 정의 변수를 사용할 수 있습니다 :

    select name, score
    from
    (
      SELECT name,
        score,
        (@row:=if(@prev=name, @row +1, if(@prev:= name, 1, 1))) rn
      FROM test123 t
      CROSS JOIN (select @row:=0, @prev:=null) c
      order by name, score desc 
    ) src
    where rn <= 2
    order by name, score;
    

    참조 데모

  3. ==============================

    3.추가 열을 가지고 괜찮다면 당신은 다음과 같은 코드를 사용할 수 있습니다 :

    추가 열을 가지고 괜찮다면 당신은 다음과 같은 코드를 사용할 수 있습니다 :

    SELECT Name, Score, rank() over(partition by Name, order by Score DESC) as rank
    From Table
    Having rank < 3;
    

    순위 기능은 각 파티션에 대해 순위를 제공, 귀하의 경우는 이름입니다

  4. ==============================

    4.이를 위해 당신은 this- 할 수

    이를 위해 당신은 this- 할 수

    http://www.sqlfiddle.com/#!2/ee665/4

    하지만 처음 2 쿼리를 얻기 위해, 당신은 0.2과 같은 ID에 대한 ID 다음 실행 제한을 사용해야합니다.

  5. ==============================

    5.당신이 뭔가를 할 수 있습니다 :

    당신이 뭔가를 할 수 있습니다 :

    SET @num :=0, @name :='';   
    SELECT name, score,
        @num := IF( @name= name, @num +1, 1 ) AS row_number,
        @name := name AS dummy
    FROM test
    GROUP BY name, score
    HAVING row_number <=2
    
  6. ==============================

    6.

    SELECT * FROM (   
        SELECT  VD.`cat_id` ,  
           @cat_count := IF( (@cat_id = VD.`cat_id`), @cat_count + 1, 1 ) AS 'DUMMY1', 
           @cat_id := VD.`cat_id` AS 'DUMMY2',
           @cat_count AS 'CAT_COUNT'   
         FROM videos VD   
         INNER JOIN categories CT ON CT.`cat_id` = VD.`cat_id`  
           ,(SELECT @cat_count :=1, @cat_id :=-1) AS CID  
         ORDER BY VD.`cat_id` ASC ) AS `CAT_DETAILS`
         WHERE `CAT_COUNT` < 4
    
    ------- STEP FOLLOW ----------  
    1 . select * from ( 'FILTER_DATA_HERE' ) WHERE 'COLUMN_COUNT_CONDITION_HERE' 
    2.  'FILTER_DATA_HERE'   
        1. pass 2 variable @cat_count=1 and  @cat_id = -1  
        2.  If (@cat_id "match" column_cat_id value)  
            Then  @cat_count = @cat_count + 1    
            ELSE @cat_count = 1      
        3. SET @cat_id = column_cat_id    
    
     3. 'COLUMN_COUNT_CONDITION_HERE'   
        1. count_column < count_number    
    
    4. ' EXTRA THING '
       1. If you want to execute more than one statement inside " if stmt "
       2. IF(condition, stmt1 , stmt2 )
          1. stmt1 :- CONCAT(exp1, exp2, exp3) 
          2. stmt2 :- CONCAT(exp1, exp2, exp3) 
       3. Final "If" Stmt LIKE 
          1. IF ( condition , CONCAT(exp1, exp2, exp3) , CONCAT(exp1, exp2, exp3) )    
    
  7. ==============================

    7.

    insert into test values('willy',1)
    insert into test values('willy',2)
    insert into test values('willy',3)
    insert into test values('zoe',4)
    insert into test values('zoe',5)
    insert into test values('zoe',6)
    
    
    ;with temp_cte
    as (
        select Name, Score,
           ROW_NUMBER() OVER (
              PARTITION BY Name
              ORDER BY Score desc
           ) row_num
        from test
    )
    select * from temp_cte
    where row_num < 3
    
  8. ==============================

    8.이 쿼리를 사용합니다.

    이 쿼리를 사용합니다.

    select * from fruits 
    where type = 'orange'  
    order by price limit 2
    

    여기에 해결 방법 : https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

  9. from https://stackoverflow.com/questions/15969614/in-sql-how-to-select-the-top-2-rows-for-each-group by cc-by-sa and MIT license