商品テーブルの中で、
同じ商品のレコードが複数あります。
その多数のレコード中に、日付項目があります。
そこから、
1)指定日に、2)一番近い過去の日の1件、3)指定日を含めて、複数ある指定日及び未来の全レコード、を抽出するには、
どのようなSQL文を書けばよいでしょうか?
1.過去に複数ある日付の中から、指定日に、一番近いレコード。
2.指定日と未来に複数ある日付の中の、全ての未来の、レコード。
レコードの例)
指定日=2015-07-01
商品ID 日付
1 2015-10-11 ・・・未来 ⇒ 抽出したい
1 2015-08-02 ・・・未来 ⇒ 抽出したい
1 2015-07-01 ・・・指定日 ⇒ 抽出したい
1 2015-07-01 ・・・指定日 ⇒ 抽出したい
1 2014-01-01 ・・・過去 ⇒ 抽出しない★
1 2015-06-03 ・・・過去 ⇒ 抽出したい
2 2015-10-11 ・・・未来 ⇒ 抽出したい
2 2015-08-02 ・・・未来 ⇒ 抽出したい
2 2015-07-01 ・・・指定日 ⇒ 抽出したい
2 2015-07-01 ・・・指定日 ⇒ 抽出したい
2 2014-01-01 ・・・過去 ⇒ 抽出しない★
2 2015-06-03 ・・・過去 ⇒ 抽出したい
No.1ベストアンサー
- 回答日時:
実は単純そうでちょっとめんどうな命題です。
例示のものだけであればこんな感じ
//元データ
create table goods (id int not null primary key auto_increment,pid int,d date);
insert into goods(pid,d) values(1,'2015-10-11'),(1,'2015-08-02'),(1,'2015-07-01'),(1,'2015-07-01'),(1,'2014-01-01'),(1,'2015-06-03'),(2,'2015-10-11'),(2,'2015-08-02'),(2,'2015-07-01'),(2,'2015-07-01'),(2,'2014-01-01'),(2,'2015-06-03');
//集計1
select g1.* from goods as g1 inner join(
select pid,max(d) as d from goods where d < '2015-07-01' group by pid) as g2
on g1.pid=g2.pid and g1.d>=g2.d
ところが・・・
データの中に、「指定日より後に(前に)しかデータがない」場合など想定するとちょっと変わってきます。
//データ追加
insert into goods(pid,d) values(3,'2014-01-01'),(3,'2014-01-02'),(4,'2015-07-10'),(4,'2015-07-11');
おなじ集計をかけるとpid=4のデータが抽出されません。
これはサブクエリ
select pid,max(d) as d from goods where d < '2015-07-01' group by pid
が指定日より過去のデータを持っているpidしか対象としないからです。
これをふまえて以下のようにするとpid=4もひろえます。
//集計2
select g1.* from goods as g1 left join(
select pid,max(d) as d from goods where d < @d:='2015-07-01' group by pid) as g2
on g1.pid=g2.pid and g1.d>=g2.d
where g2.d is not null or g1.d>=@d
ご回答及び、派生した考慮、ありがとうございます。
確かにおっしゃるとおりのことの可能性もあります。
今から、実際にプログラムに組み込んでテストしてみます。
お手数をおかけしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- 環境・エネルギー資源 培養魚肉の製造原価が3000分の1のコストで作れるという会社について 2 2023/01/26 19:47
- Excel(エクセル) エクセルで重複データから重複を削除して指定の列に抽出したい 11 2022/05/11 11:26
- Oracle 列1と列2の関係性で列3の条件に一致するレコードを抽出したい 1 2022/04/13 07:46
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
AccessVBAについて テーブルの...
-
下記の問合せを行うクエリを、 ...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
データ削除とSQL*Loaderでのイ...
-
T-SQLで任意の箇所で強制終了す...
-
オラクルのUPDATEで複数テーブル
-
SELECT INTOで一度に複数の変数...
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
-
結合したテーブルをSUMしたい
-
右向き、左向きの速度が最大と...
-
SQLで、Join句で結合したテ...
-
エラーを起こす方法
-
平均値のもとめ方
-
UPDATEで既存のレコードに文字...
-
timestampのデータはどのように...
-
selectの単純繰り返し
-
ゼロ未満の場合で更新する場合
-
sqlに記述できない文字
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AccessVBAについて テーブルの...
-
1つのSQLで2段階の抽出を行い...
-
SQLでレコード間の値の交換
-
limit offset はupdate文には使...
-
SQLで、過去で一番大きい日付の...
-
【SQL】項目に紐づいている情報...
-
複数の値を1レコードに表示した...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
-
Accessで今日から5日後
-
既存データをINSERT文にして出...
-
timestampのデータはどのように...
おすすめ情報