sqlで大量のデータのかなから対象の期間を抽出し
その中から最新と最古のカラムを取得したいです。
例えば2014年1月13日〜1月19日の期間を指定し
その期間の中にある日付が最新の商品と最古の商品を取得
対象テーブル
日付 商品
0110 たんぽぽ
0113 まめ
0115 ナッツ
0118 となかい
0120 唐辛子
抽出
まめ となかい
抽出は一レコード
最も簡単に書くにはどうすればいいでしょう
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
最新・最古の日付が複数ある場合、
どのようなデータが取得すべきかは要件次第ですが、
ぱっと思いつくクエリは以下です。
(※動作は見てないので動く保証はないです)
SQL
1SELECT 2 T1.* 3FROM 4 SAMPLE_TABLE T1 5 INNER JOIN 6 ( 7 SELECT 8 MAX(T.日付) AS 最大日付 9 , MIN(T.日付) AS 最小日付 10 FROM 11 SAMPLE_TABLE T 12 WHERE 13 T.日付 BETWEEN '0113' AND '0119' 14 ) T2 15 ON T1.日付 IN (T2.最大日付, T2.最小日付)
1レコードで取りたいとのことを見逃してました。
DBMSの記載がないのでベンダ依存しないもので書いてるとかんり不恰好に・・・
もっと簡単にかけそうな気はする・・・
SQL
1SELECT 2 MAX(T.商品1) AS 商品1 3, MAX(T.商品2) AS 商品2 4FROM 5 ( 6 SELECT 7 1 AS DUMMY 8 , (CASE WHEN T1.日付 = T2.最大日付 THEN T1.商品 ELSE NULL END) AS 商品1 9 , (CASE WHEN T1.日付 = T2.最小日付 THEN T1.商品 ELSE NULL END) AS 商品2 10 FROM 11 SAMPLE_TABLE T1 12 INNER JOIN 13 ( 14 SELECT 15 MAX(日付) AS 最大日付 16 , MIN(日付) AS 最小日付 17 FROM 18 SAMPLE_TABLE 19 WHERE 20 T.日付 BETWEEN '0113' AND '0119' 21 ) T2 22 ON T1.日付 IN (T2.最大日付, T2.最小日付) 23 ) T 24GROUP BY 25 T.DUMMY
補足
コード例を書いては見ましたが、
SQLのコーディング力は思考錯誤しないと身につかないので、
こういうパターンの場合はやりたいことを段階的に行えばよいかと思います。
- 該当する日付期間で絞り込む(「SQL 範囲指定」で検索して色々な例を見てみて下さい)
- あるデータの最大値、最小値を取得する(「SQL 最大 最小」で検索して色々な例を見てみて下さい)
- 取得した最大値または最小値に該当するデータを取得する(「sql or 複数」で検索して色々な例を見てみて下さい)
1つ1つの課題するSQLを書けたら、後は組み合わせるだけです。
投稿2016/09/09 14:34
編集2016/09/09 15:10総合スコア1636
0
最古の商品は日付の昇順の先頭1行(imit 1)で、
最新の商品は日付の降順の先頭1行(imit 1)で、
それぞれ取得できます。
これをサブクエリにして、ダミー出力(from句を省略)すればどうでしょう。
sql
1select 2 ( 3 select 商品 4 from 対象テーブル 5 where 日付 BETWEEN '0113' AND '0119' 6 order by 日付 7 limit 1 8 ) 商品1, 9 ( 10 select 商品 11 from 対象テーブル 12 where 日付 BETWEEN '0113' AND '0119' 13 order by 日付 desc 14 limit 1 15 ) 商品2 16 ;
SQL Fiddle での実行例
http://sqlfiddle.com/#!9/1f0b4/2
タイトルが MySQL なので、MySQL のコード例ですが、Oracle などのFROM句を省略できないRDBMSの場合は、最後に、FROM DUAL を追加してください。
投稿2016/09/09 16:43
編集2016/09/09 16:54総合スコア34343
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
質問を勘違いしていたので、紛らわしいので削除しておきます。すみません。
投稿2016/09/09 14:24
編集2016/09/09 22:31総合スコア6586
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。