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

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

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

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

1回答

2799閲覧

SQLで隣接するレコードのみグループ化したい

vc3000

総合スコア196

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

4グッド

1クリップ

投稿2016/12/18 02:52

編集2016/12/18 02:56

このようなテーブルがあるとします:

postgres=# select * from t order by id; id | code | value ----+------+------- 1 | a | 1 2 | a | 2 3 | a | 3 4 | b | 4 5 | b | 5 6 | c | 6 7 | a | 7 8 | a | 8 (8 行)

id順で並べたとき、codeが同一で隣接しているレコードをグループ化して、valueの合計を計算したいのです。
求める結果はこんな感じです。

a 6 b 9 c 6 a 15

これはSQL一発でできますでしょうか?
使っているDBはPostgres 9.5ですが、他のDBでも方法がありましたら教えていただきたいです。

テスト用のCREATE文です:

CREATE TABLE t ( id serial, code varchar(10), value int ); INSERT INTO t (code, value) VALUES ('a', 1); INSERT INTO t (code, value) VALUES ('a', 2); INSERT INTO t (code, value) VALUES ('a', 3); INSERT INTO t (code, value) VALUES ('b', 4); INSERT INTO t (code, value) VALUES ('b', 5); INSERT INTO t (code, value) VALUES ('c', 6); INSERT INTO t (code, value) VALUES ('a', 7); INSERT INTO t (code, value) VALUES ('a', 8);
AketiJyuuzou, tamako, Gyoubu, Hyuuga👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

PostgreSQL8.4新機能 window関数
https://oraclesqlpuzzle.ninja-web.net/pgcon2009-olap.html#1-15
の「15. 連続範囲の最小値と最大値 (3人旅人算)」を見ながら
PostgreSQL9.3で作ってみました :-)

sql

1with t(ID,Code,Value) as( 2values(1,'a',1), 3 (2,'a',2), 4 (3,'a',3), 5 (4,'b',4), 6 (5,'b',5), 7 (6,'c',6), 8 (7,'a',7), 9 (8,'a',8)), 10tmp as( 11select ID,Code,Value, 12 Row_Number() over(order by ID) 13-Row_Number() over(partition by Code order by ID) as Distance 14 from t) 15select Code,sum(Value) 16 from tmp 17group by Code,Distance 18order by Min(ID); 19 20| code | sum | 21|------|-----| 22| a | 6 | 23| b | 9 | 24| c | 6 | 25| a | 15 | 26

投稿2016/12/18 10:04

編集2019/03/12 06:30
AketiJyuuzou

総合スコア1147

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

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

vc3000

2016/12/19 11:18

``` select id, code, value, row_number() over (order by id), row_number() over (partition by code order by id) from t; ``` を見てみると分かりやすいですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問