2012-03-20 2 views
0

私は値が似ている分野MySQLの派生テーブル

  • ランク
  • ID

でMySQLのテーブル名テーブルがあるとします。

10, 2012-01-01, 3 
9, 2012-01-04, 3 
5, 2012-01-07, 3 
3, 2012-01-10, 3 
10, 2012-01-01, 4 
6, 2012-01-04, 4 
7, 2012-01-07, 4 

単一のSQL、どのように私は両方の最後と最初の値を取得することができますソートb yの日付はIDでグループ化されていますか?

は、私が取得する方法を知っている最初のまたは最後の1

SELECT rank, id FROM 
    (SELECT rank, id FROM table ORDER BY date DESC) s GROUP BY id; 

私はフィールドがsomethinkのようなことを返されたことを希望:lastrank、firstrankとid。

は私があなたの質問を理解していることを完全にはわからないんだけど、私はとにかく答えることをしようとするつもりだあなたに

+0

あなたはlastrank/firstrankがランクの値または日付の値に基づいていると言っていますか? – Taryn

+0

min(ランク)とmax(ランク)は必ずしも最初と最後の行であるとは限りません。行はランクではなく日付でソートされます。 - – keepwalking

答えて

0

このお試しください:このクエリは、入力として、あなたのsamplaデータを取った結果がある

select id, 
    max(if(MyOrder = 1, rank, null)) as FirstRank, 
    max(if(MyOrder = 2, rank, null)) as LastRank 
from (
    select t1.id, t1.rank, 1 MyOrder from t t1 
    left join t t2 on 
    t1.id = t2.id and t1.date > t2.date 
    where t2.date is null 
    union 
    select t1.id, t1.rank, 2 from t t1 
    left join t t2 on 
    t1.id = t2.id and t1.date < t2.date 
    where t2.date is null 
) s 
group by id 

を:

+----+-----------+----------+ 
| ID | FIRSTRANK | LASTRANK | 
+----+-----------+----------+ 
| 3 |  10 |  3 | 
| 4 |  10 |  7 | 
+----+-----------+----------+ 
+0

min(ランク)とmax(ランク)は必ずしも最初と最後の行であるとは限りません。行はランクではなく日付でソートされます。 – keepwalking

+0

私の答えを更新:) –

0

ありがとうございます。

SELECT min(rank), max(rank), id 
    FROM table 
    ORDER BY date DESC 
    GROUP BY id; 

グループ化するときに、集計関数を使用してグループから特定のサンプルを取得できます。

0

は、この文字列で検索してください -

SELECT 
    t1.*, 
    IF(t1.date = t2.min_date, 'FIRSTRANK', 'LASTRANK') rank_type 
FROM table_rank t1 
    JOIN (
    SELECT id, MAX(date) max_date, MIN(date) min_date FROM table_rank GROUP BY id 
    ) t2 
    ON t1.id = t2.id AND (t1.date = t2.min_date OR t1.date = t2.max_date) 
0

GROUP_CONCAT(順位を参加BY日付)、SUBSTRING_INDEXを使用します。

関連する問題