ちょっと壁に当たったので、わかる範囲でお答え頂きたいのですが、
以下のようなテーブルがあったとします。
id user price date
1 A 1000 2013/5/31
2 A 1200 2013/6/1
3 B 1000 2013/5/20
4 A 1500 2013/5/12
5 C 1300 2013/5/31
6 C 1400 2013/5/14
7 C 1000 2013/5/6
8 B 1100 2013/5/24
9 B 1200 2013/5/30
10 B 1100 2013/5/4
11 A 1800 2013/4/12
12 C 900 2013/4/6
・・・
次に取得したいのは、
A 1200 2013/6/1
A 1000 2013/5/31
A 1500 2013/5/12
C 1300 2013/5/31
C 1400 2013/5/14
C 1000 2013/5/6
B 1200 2013/5/30
B 1100 2013/5/24
B 1000 2013/5/20
このようなデータなのですが、
条件:
1.userでグループ化したうちの日付降順で並べる
2.そのuserのデータの中で、日付降順で並べる
3.userのデータが複数あっても、取得するのは新しいものから3件のみ
この条件を満たすSQL文はどのように記述すればよいか、お知恵をお貸し下さい。
よろしくお願いします。
No.4
- 回答日時:
>3.userのデータが複数あっても、取得するのは新しいものから3件のみ
まで考えるとidも比較しなくてはいけないかもしれないですね
select * from テーブル as t1
where (select count(*) from テーブル as t2 where
t1.user=t2.user and
(t1.date<t2.date or t1.date=t2.date and t1.id<t2.id)
) <3
order by
(select max(`date`) from テーブル as t3 where t1.user=t3.user) desc
,user
,`date` desc
No.3
- 回答日時:
参考にしてください。
CNT列はグルーピングごとにカウントアップするのでこれをWHERE条件で絞ればいいかなと思います。
No.2ベストアンサー
- 回答日時:
#1です。
少し訂正が有ります。複数の user の最新の日付が同じ場合に、それらのuserのデータが混ざって出力される可能性が有るので、ORDER BY句に user も含めるべきでした。
SELECT * FROM tbl_hoge a
WHERE (SELECT COUNT(*) FROM tbl_hoge b WHERE a.user = b.user AND a.date < b.date) < 3
ORDER BY
(SELECT MAX(date) FROM tbl_hoge c WHERE a.user = c.user) DESC,
user,
date DESC
;
ありがとうございました!
希望通りの抽出が行えました。
実際のSQL文はもう少し複雑なのですが、提示して頂いた例を参考にアレンジさせて頂きました。
まだまだ勉強中の身ですので、またお世話になる際はよろしくお願いします。
No.1
- 回答日時:
下記の様なSQLで出来るかと。
version 5.5.8 で確認しました。
SELECT * FROM tbl_hoge a
WHERE (SELECT COUNT(*) FROM tbl_hoge b WHERE a.user = b.user AND a.date < b.date) < 3
ORDER BY
(SELECT MAX(date) FROM tbl_hoge c WHERE a.user = c.user) DESC,
date DESC
> 1.userでグループ化したうちの日付降順で並べる
user 単位では最新の日付の降順になるということですよね?
ORDER BY句の自己結合で同じuserの中で最新の日付を取得して実現しています。
> 2.そのuserのデータの中で、日付降順で並べる
同一の user のデータ同士も日付の降順になるということですよね?
ORDER BY句の date DESC で実現しています。
> 3.userのデータが複数あっても、取得するのは新しいものから3件のみ
WHERE句の自己結合で実現しています。
同じuserでそれより新しい日付のデータが3件未満という意味です。
参考URL:http://codezine.jp/article/detail/460
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
上位3位を求めるSQL文は?
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
mysqlでunixtimeによる日付範囲...
-
MySQL「 INT」「 DATETIME」違い
-
先期末日の日付を求めるSQL
-
SQLローダーCSV取込で、囲み文...
-
配列に指定した値が含まれてい...
-
【PL/SQL】FROM区に変数を使う方法
-
テーブルの最後(最新)のレコー...
-
SQL*Loader Append
-
レコードの登録順がおかしい
-
ワイルドカード検索として合致...
-
ファイルの漢数字の順番につい...
-
アクセスに関して。クエリの並...
-
WORDの「並べ替え」について
-
2つの列が同じ値の行を取得するSQL
-
単一グループのグループ関数で...
-
SELECT文の結果を変数に・・・
-
エクセル、並び替え正しくソー...
-
int型フィールドにnullを登録で...
-
Selectした時のレコードの取得順
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<SQL>重複しているデータの場合...
-
複数のテーブルから値を合計出...
-
最新の日付と2番目の日付のデー...
-
DISTINCTROWについてです。
-
MySQL「 INT」「 DATETIME」違い
-
直近1ヶ月に誕生日を迎える社員...
-
SQLで、同じ値が何回連続す...
-
【ExcelVBA】入力された日付か...
-
mysqlに格納されている日付のデ...
-
SQLです教えてくださいお願いし...
-
SQL 重複しないJoinの仕方を教...
-
Mysqlで最新の日付を持つデータ...
-
mysqlでunixtimeによる日付範囲...
-
MySQLで特定のグループの上位3...
-
日付検索で0001-01-01 00:00:00...
-
MySQLのtimestamp型について
-
先期末日の日付を求めるSQL
-
EXCEL 日付範囲内の日数カウン...
-
mysqlコマンドとPHPで同じSQLの...
-
mysqlのif文かcase文で複数条件...
おすすめ情報