[SQL] SQL에서 어떻게 각 그룹의 상위 2 행을 선택합니다
SQLSQL에서 어떻게 각 그룹의 상위 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.
SELECT * FROM test s WHERE ( SELECT COUNT(*) FROM test f WHERE f.name = s.name AND f.score >= s.score ) <= 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.추가 열을 가지고 괜찮다면 당신은 다음과 같은 코드를 사용할 수 있습니다 :
추가 열을 가지고 괜찮다면 당신은 다음과 같은 코드를 사용할 수 있습니다 :
SELECT Name, Score, rank() over(partition by Name, order by Score DESC) as rank From Table Having rank < 3;
순위 기능은 각 파티션에 대해 순위를 제공, 귀하의 경우는 이름입니다
-
==============================
4.이를 위해 당신은 this- 할 수
이를 위해 당신은 this- 할 수
http://www.sqlfiddle.com/#!2/ee665/4
하지만 처음 2 쿼리를 얻기 위해, 당신은 0.2과 같은 ID에 대한 ID 다음 실행 제한을 사용해야합니다.
-
==============================
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.
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.
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.이 쿼리를 사용합니다.
이 쿼리를 사용합니다.
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/
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
'SQL' 카테고리의 다른 글
[SQL] 크로스 조인을 사용하여 두 테이블 사이에 쉼표를 넣어의 차이점은 무엇입니까? (0) | 2020.04.11 |
---|---|
[SQL] SQL Server의 두 날짜 사이의 모든 날짜를 가져옵니다 (0) | 2020.04.11 |
[SQL] 점검 제한 조건에 하위 쿼리 (0) | 2020.04.11 |
[SQL] DELIMITER //는 트리거에서 어떤 기능을 수행합니까? (0) | 2020.04.11 |
[SQL] LINQ를 검색 와일드 카드 (0) | 2020.04.11 |