2016-06-29 4 views
-1

나는 ID, User, Ranking 및 CreatedDate를 저장하는 테이블을 가지고 있습니다. 순위를 반복 할 수 있습니다. 나는 그룹까지 사용자의 순위 4 기지에 좋아하고 1,2,3 표 4.최근 20 개의 레코드를 검색하는 SQL 쿼리

예 랭킹의 최신 (20) 기록을 가져 오는 것입니다 : 내가 원하는 결과가

ID User  Ranking  CreatedDate 
---------------------------------------- 
1 B.Sisko  1st  1461136714 
2 B.Sisko  2nd  1461123378 
3 B.Sisko  3rd  1461123378 
4 B.Sisko  3rd  1461600137 
5 K.Janeway  3rd  1461600137 
6 K.Janeway  4th  1461602181 
7 K.Janeway  4th  1461603096 
8 J.Picard  3rd  1461603096 
9 J.Picard  4th  1461603096 
10 J.Picard  4th  1461603096 

을 :

ID User  Ranking  CreatedDate 
---------------------------------------- 
1 B.Sisko  1st  1461136714 
2 B.Sisko  2nd  1461123378 
3 B.Sisko  3rd  1461123378 
4 B.Sisko  3rd  1461600137 
5 K.Janeway  3rd  1461600137 
6 K.Janeway  4th  1461602181 
7 J.Picard  3rd  1461603096 
8 J.Picard  4th  1461603096 

쿼리를 검색 할 수있게하고 싶습니다. 어떤 도움을 주시면 감사하겠습니다.

+7

'User'에 순위 4 기지까지 그룹은 무엇을 의미합니까? 그런데 스타 트랙 선장의 이름을 잘 사용합니다. –

+0

예가 귀하의 결과와 다른 점은 무엇입니까? 기록에서 결과에서 ID가 어떻게 바뀌는가? (J Picard 3). 이것은 단지 혼란 스러울뿐입니다. – dbmitch

+0

그럼, 어느 RDBMS? – Strawberry

답변

0

타사 추가 기능을 사용하지 않고 SQL Server에서 LIMIT을 사용할 수는 없지만 행 번호가 작동 할 수 있습니다. 내가 여기 일이 일어날해야하지만 모르겠어요

아이디어입니다 : 내가 생각

WITH cte_1 AS(
SELECT MIN(DATE) AS DATE 
    , USER 
    , RANK 
FROM TABLE 
WHERE RANK = 4 
GROUP BY USER, RANK 
UNION ALL 
SELECT DATE 
    , USER 
    , RANK 
FROM TABLE 
WHERE RANK <> 4 
), 
cte_2 AS (
SELECT *, ROW_NUMBER() OVER(ORDER BY USER, RANK) as run 
FROM cte_1 
) 
SELECT * 
FROM cte_2 
WHERE rank <= 20 
0

, 당신은 ORDER BY 모두 USERRANK하려는 다음

SELECT * FROM TABLE ORDER BY USER,RANK LIMIT 20 
0

Ranking이 4 또는과 같지 않으면 Ranking이 4이지만 해당 순위에 대해 가장 빠른 CreatedDate이있는 쿼리는 레코드를 유지합니다. 귀하의 질문에 대한

SELECT t1.* 
FROM yourTable t1 
LEFT JOIN 
(
    SELECT Ranking, MIN(CreatedDate) AS CreatedDate 
    FROM yourTable 
    GROUP BY Ranking 
) t2 
    ON t1.Ranking = t2.Ranking AND t1.CreatedDate = t2.CreatedDate 
WHERE t1.Ranking <> '4th' OR (t1.Ranking = '4th' AND t2.Ranking IS NOT NULL) 
+5

의견이나 질문 모두 나에게 명확하지 않습니다. 나는 스타 트렉을 좋아하기 때문에 대답했다 :-) –

+3

@TimBiegeleisen - 가격 ... – sgeddes

+0

@TimBiegeleisen - 나는 당신의 의견을 좋아한다; P –

0

확실하지 아직하지만 다음 시도)

select * 
from table1 
where `Ranking` in ('1st', '2nd', '3rd', '4th') 
group by 
case `Ranking` 
when '4th' then concat(`User`, `Ranking`) 
else `ID` end 
order by id 

그리고 SQLFiddle demo here합니다. 코드 아래

0

이 유용 할 수 있습니다

;WITH CTE AS 
(
SELECT ROW_NUMBER()OVER(PARTITION BY [USER],RANKING ORDER BY Ranking,CreatedDate) as RN, * FROM #T 
) 
,CTE1 AS (
SELECT * from CTE WHERE Ranking IN ('1st','2nd','3rd') 
) 
SELECT ROW_NUMBER()OVER(ORDER BY ID) AS ID,[User] 
, Ranking 
,CreatedDate 
FROM(
SELECT ID,[User] 
, Ranking 
,CreatedDate 
FROM CTE1 
UNION ALL 
SELECT ID,[User] 
, Ranking 
,CreatedDate 
FROM CTE 
WHERE RN =1 AND Ranking NOT IN ('1st','2nd','3rd') 
) T 
관련 문제