2016-05-21 162 views
0

user_idの特定の日付の前に最も近い日付のみを選択する方法(フル行を選択)MySQL:特定の日付の前に最も近い日付を選択

id  user_id  create_date 
0   1   2016-01-01 
1   1   2016-01-05 
2   2   2016-01-06 
3   3   2016-01-06 
4   2   2016-01-09 
5   2   2016-01-12 
6   4   2016-01-15 
7   1   2016-01-21 
8   2   2016-01-22 
9   5   2016-01-25 

SQLサンプル:

select t.id,t.user_id,MAX(t.create_date) 
from sample_table t 
where date(t.create_date) < '2016-01-20' 
group by t.user_id 
limit 10 

期待される結果を(期待通りに動作していないようです):

id  user_id  create_date 
1   1   2016-01-05 
3   3   2016-01-06 
5   2   2016-01-12 
6   4   2016-01-15 

答えて

1

create_date増加などidの増加です。これは合理的なようで、trueの場合は、使用することができます:

select max(t.id) as id, t.user_id, MAX(t.create_date) 
from sample_table t 
where date(t.create_date) < '2016-01-20' 
group by t.user_id; 

私はdate()機能がwhere句で必要とされているとは思いません。インデックスが使用されないようにします(適切な場合)。

1

あなたに

テーブルのサンプルを(各ユーザーのための単一の行を選択)使用可能

select 
    t.id, t.user_id, t.create_date 
from 
    sample_table t 
inner join 
    (
     select 
      user_id, MAX(create_date) max_create_date 
     from 
      sample_table 
     where 
      date(create_date) < '2016-01-20'; 
     group by 
      user_id 
    ) t1 
on 
    t.user_id = t1.user_id and t.create_date = t1.max_create_date; 
+0

"結合"と "ネストされたクエリ"ではなく、パフォーマンスソリューションがありますか? – mwafi

+1

@mwafi ** mysql **については、私は**ノー**と思います。 postgreSQL、oracle、SQL server> = 2012のような他のものについては、元のクエリで 'MAX(t.create_date)over(t.user_id順のt.user_id順)'のような分析機能を利用することができます。select異なっていてグループ化する必要はありません。 –

0

あなたは、ネストされた選択を使用することができます。

ここ
select * from 
    (select * from sample_table where 
      date(create_date) < '2016-01-20' 
      order by user_date desc 
    )t 
group by user_id 

はあなたのサンプルデータでfiddle

+0

これは、選択された行が最も近いことを保証するものではありません。 – mwafi

+0

どうしてでしょうか?これは、各user_idに指定された日付の前に最大日付を返します。 –

+0

いいえ、テスト後です。 – mwafi

関連する問題