2017-10-25 21 views
0

にグループごとに上位10行を選択します。私は上位10行が注文を取得したいと思います(user_idは、activity_date、ACTIVITY_TYPE)私はこのようなテーブル持って指定された日付

id int primary key 
user_id int, 
activity_date date, 
activity_type int, 
activity_value float 

uniqのキーを指定された日付(activity_date)の各activity_typeactivity_valueによって、今日または昨日と言います。

私は自己結合バリアントを試しましたが、正しい結果が得られませんでした。ここで私が試したことがあります。

select 
    a.user_id, a.activity_date, a.activity_type, a.activity_value 
from 
    my_table a 
left join 
    my_table b on a.activity_type = b.activity_type and a.id < b.id 
where 
    a.activity_date = curdate() 
group by 
    a.id 
having 
    count(*) < 10 
order by 
    a.activity_value desc; 

SQLフィドル:http://sqlfiddle.com/#!9/d30332/3

誰かが私はこのクエリを修正助けることができますか?

+0

は、T-SQLでは、ACTIVITY_TYPE用のパーティション上のランクを行うことができますが、私は、MySQLの等価だか分かりません。 – derloopkat

+0

現在のソリューションで何が問題になっていますか? –

+0

@derloopkat私が知っているようにMySQLに相当するものはありません) –

答えて

1

おお、私はあなたがちょうどb.activity_date = curdate()状態を逃すと思います。また、LEFT JOINは不要だと思います。

select a.* 
from my_table a 
join my_table b on a.activity_type = b.activity_type and 
        a.activity_value <= b.activity_value 
where a.activity_date = curdate() and b.activity_date = curdate() 
group by a.id 
having count(*) <= 10 

demo

+0

これはうまくいきません。行は正しく戻されますが、行の先頭はactivity_value順ではありません。 SQL Fiddle:http://sqlfiddle.com/#!9/d30332/1 – Nagarjun

+0

@Nagarjun今すぐ試す –

+0

最後の結果が常に欠落していることを除いて、それは素晴らしいことです。たとえば、カウント(*)<= 2を<= 3に変更すると、sqlfiddleに3行があってもカテゴリごとに2つの行が表示されます。 – Nagarjun

関連する問題