質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

1340閲覧

mysql

eri11

総合スコア10

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/09 14:14

sqlで大量のデータのかなから対象の期間を抽出し
その中から最新と最古のカラムを取得したいです。

例えば2014年1月13日〜1月19日の期間を指定し
その期間の中にある日付が最新の商品と最古の商品を取得

対象テーブル
日付 商品
0110 たんぽぽ
0113 まめ
0115 ナッツ
0118 となかい
0120 唐辛子

抽出
まめ となかい

抽出は一レコード

最も簡単に書くにはどうすればいいでしょう

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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のコーディング力は思考錯誤しないと身につかないので、
こういうパターンの場合はやりたいことを段階的に行えばよいかと思います。

  1. 該当する日付期間で絞り込む(「SQL 範囲指定」で検索して色々な例を見てみて下さい)
  2. あるデータの最大値、最小値を取得する(「SQL 最大 最小」で検索して色々な例を見てみて下さい)
  3. 取得した最大値または最小値に該当するデータを取得する(「sql or 複数」で検索して色々な例を見てみて下さい)

1つ1つの課題するSQLを書けたら、後は組み合わせるだけです。

投稿2016/09/09 14:34

編集2016/09/09 15:10
Panzer_vor

総合スコア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
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問を勘違いしていたので、紛らわしいので削除しておきます。すみません。

投稿2016/09/09 14:24

編集2016/09/09 22:31
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問