2016-12-01 10 views
0

最古の日付に基づいて行のランクを付けたいと思います。ただし、行の兄弟(同じグループ内の行)のランクが高い場合は、ランキングに影響します。現在MySQL:グループの最も早い日付を使用して各行のランクを確認してください

id | group | date 
1  11  2016-12-1 
2  11  2016-01-1 
3  22  2016-02-1 
4  22  2016-05-1 
5  3  2016-04-1 
6  3  2016-06-1 

は:

SELECT *, @curRank := @curRank + 1 AS rank 
FROM table 
SELECT @curRank := 0) r 
ORDER BY date ASC 

id | group | date  | rank 
2  11  2016-01-1 1 
3  22  2016-02-1 2 
5  3  2016-04-1 3 
4  22  2016-05-1 4 
6  3  2016-06-1 5 
1  11  2016-12-1 6 

私は

id | group | date  | rank 
2  11  2016-01-1 1 
1  11  2016-12-1 6 
3  22  2016-02-1 2 
4  22  2016-05-1 4 
5  3  2016-04-1 3 
6  3  2016-06-1 5 
+1

私はあなたがこれを2回通過を取らなければならない/したいと思います。最初のパスは、各グループの最下位日付を取ってランク付けし、グループの順位順に基づいて順位を付け直します。 – xQbert

+0

グループは複数の兄弟を持つことができるので、グループ内の第3、第4のアイテムでどのように動作するのかわかりません。 – Kris

答えて

1

私はグループが予約語であるため、grouppするTEST1およびグループ列に、あなたのテーブルの名前を変更しました。

次のクエリはたqryでマークされたクエリはあなたに各grouppための最小の日付を持つレコードを取得します

SELECT t1.* 
FROM (SELECT id, groupp, min(date), @rownum := @rownum + 1 as rank 
     FROM test1, (SELECT @rownum := 0) r 
     GROUP BY groupp 
     ORDER BY date ASC) qry 
INNER JOIN test1 t1 on t1.groupp = qry.groupp 
ORDER BY qry.rank, t1.date asc; 

あなたの望ましい結果が得られます。 クエリt1は、テーブルからすべてのレコードを取得します。 これらの2つをgroupp列に結合すると、基本的に最初のクエリの結果に基づいて適切なランクのテーブルからすべてのレコードが取得されます。 あなたはランクと日付でちょうど注文します。

は、私は、クエリをテストし、それがSQLのフィドルと望ましい結果を返す

http://sqlfiddle.com/#!9/90dee/1

+0

論理を説明するか、いくつかの用語を提供する必要があります。 –

0

は、あなただけの巣既存のインライン・ビューとしてクエリとは、再びランキング実行できるように思える達成する必要があります。

未テスト:

SELECT Z.*, @newRank := @newRank + 1 as NewRank 
FROM (SELECT *, @curRank := @curRank + 1 AS rank 
     FROM foo 
     CROSS JOIN (SELECT @curRank := 0) r 
     ORDER BY mdate ASC) Z 
CROSS JOIN (Select @newRank :=0) 
ORDER BY rank, mdate 
関連する問題