以下のようなテーブルがあったとします。
select * from T1;
+------------+------+
| date | num |
+------------+------+
| 2014-01-01 | 1 |
| 2014-01-02 | 2 |
| 2014-01-03 | 2 |
| 2014-01-05 | 1 |
| 2014-01-07 | 1 |
+------------+------+
このとき、「各日付を起点として、その日を含む過去3日分の合計num数を出力」させるためにはどのようなSQLを書けばいいのでしょうか。
以下のような結果が返ってくることを期待しています。
| date | sum_num |
+------------+------+
| 2014-01-01 | 1 |
| 2014-01-02 | 3 | ※ 1+2
| 2014-01-03 | 5 | ※ 1+2+2
| 2014-01-05 | 3 | ※ 2+1
| 2014-01-07 | 2 | ※ 1+1
+------------+------+
PostgreSQL 8系なのですが、環境の問題でwith recursive句を使うことができません。
相関サブクエリをうまく使って取得する方法は無いでしょうか。
よろしくお願いいたします。
No.1
- 回答日時:
以下のクエリを「q1」として作成。
SELECT date, Sum(num) AS num
FROM (SELECT Table1.date, Table1.num
FROM Table1
union
SELECT Table1.date-1, 0 as num
FROM Table1
union
SELECT Table1.date-2, 0 as num
FROM Table1)
GROUP BY date;
以下のクエリで結果取得。
SELECT q1_2.date, q1.num+q1_1.num+q1_2.num AS sum_num
FROM q1, q1 AS q1_1, q1 AS q1_2
WHERE (((q1.date)=q1_1.date-1 And (q1.date)=q1_2.date-2) AND ((q1_2.num)<>0));
No.3
- 回答日時:
追記の追記。
ANo.1のクエリでは、レコード件数が多い場合は、非常に遅くなります。
何故なら「結果クエリが、総当りですべての組み合わせを生成してから、Where句で条件に合う物を抽出している」からです。
例えば、元のテーブルが1000件あると、1000×1000×1000で1000000000件のレコードを生成してから、条件に合う1000件を抽出する事になります。
レコード件数が多い場合は、最初のq1を工夫して
該当日のdate、該当日の数量、1日前のdate、2日前のdate
を出力するようにして、結果クエリで参照するq1を、LEFT JOINで結合しましょう。
LEFT JOINで結合すれば「総当りですべての組み合わせを生成」って事が起きません。
No.4ベストアンサー
- 回答日時:
INNER JOINに書き換えたのが以下。
q1クエリ
SELECT date, Sum(num) AS num, date1, date2
FROM (SELECT Table1.date, Table1.num,Table1.date-1 as date1,Table1.date-2 as date2
FROM Table1
union
SELECT Table1.date-1, 0 as num,Table1.date-2 as date1,Table1.date-3 as date2
FROM Table1
union
SELECT Table1.date-2, 0 as num,Table1.date-3 as date1,Table1.date-4 as date2
FROM Table1)
GROUP BY date, date1, date2;
結果クエリ
SELECT q1.date, q1.num+q1_1.num+q1_2.num AS sum_num
FROM (q1 INNER JOIN q1 AS q1_1 ON q1.date1 = q1_1.date) INNER JOIN q1 AS q1_2 ON q1_1.date1 = q1_2.date
WHERE q1.num<>0;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL 複数条件を設定
-
SQLで2年連続で値が上昇した年...
-
pandasでsqlite3にテーブル作成...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
Excelでしりとりを作る方法
-
Accessで最新のレコード...
-
オシロスコープYOKOGAWA DL708...
-
truncate tableを使って複数の...
-
Activation codeとは
-
エラーを起こす方法
-
次の時間帯の勝率の合計を求め...
-
Accessの構成をコピーしたい
-
sqlに記述できない文字
-
PostgreSQLのtimestamp型で時間...
-
SQLのテーブルにないデータの出力
-
1つのドメインを複数のDNSで管...
-
認知心理学で言うスクリプトとは?
-
フラグをたてるってどういうこ...
-
自作アプリからAPIで他のアプリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
joinの場合のテーブル名の別名...
-
2つの列からの最大値取得
-
複数行の結果を単一列に連結
-
SQLのこと:distinctして並び替...
-
postgreSQLのupdateについて
-
access2000のクエリについて
-
SQL文の長さ制限について
-
SQLで期間をずらした集計処理
-
SQL 複数条件を設定
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
-
Accessで今日から5日後
おすすめ情報