2016-06-29 11 views
-1

私はテーブルにID、ユーザー、ランキング、およびCreatedDateを格納しています。ランキングを繰り返すことができます。私が望む結果が最新の20件のレコードを取得するためのSQLクエリ

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 

私はグループアップユーザーにランキング4ベースをしたいと表の1,2,3及び4

例のランキングの最新の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 J.Picard  3rd  1461603096 
8 J.Picard  4th  1461603096 

これを取得できるようにするクエリが必要です。どんな助けもありがとう。

+7

'User'にランキング4台までのグループは何を意味するのでしょうか?スタートレックのキャプテンの名前をうまく利用しています。 –

+0

例はあなたの結果とどのように異なっていますか?レコードはその結果のIDをどのように変更するのですか(J Picard 3rd)。これは単なる混乱です。 – 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 BYUSERRANKの両方にしたい、と思う:

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 - Priceless ... – 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 
関連する問題