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

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

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

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

SQL

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

解決済

グループ分けをPostgreSQLのSQL文で実行したいです

LAVENDER
LAVENDER

総合スコア1

PostgreSQL

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

SQL

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

1回答

0リアクション

0クリップ

195閲覧

投稿2022/09/20 06:32

前提

次のようなテーブルがあります
NO FLD1 FLD2 Group
1 A B
2 B C
3 C D
4 C E
5 E F
6 F G
7 G H
8 I J
9 I K
10 L M

(FLD1,FLD2)のセットはユニークで
FLD1<FLD2となるように並べて
行としても昇順に格納されています。
AとBは同一グループ
BとCは同一グループ
CとDは同一グループ
という意味で、演繹法で
A,B,C,D,E,F,G,Hは一つのグループ
I,J,Kは同一グループです。

実現したいこと

次のようにグループ分けしたときの
Noの最小値をGroupに
書き込みしたいと思います。
NO FLD1 FLD2 Group
1 A B 1
2 B C 1
3 C D 1
4 C E 1
5 E F 1
6 F G 1
7 G H 1
8 I J 8
9 I K 8
10 L M 10

発生している問題・エラーメッセージ

お試しでACCESS VBAでテストデータ10件を
順次処理をすると出来ましたが、
本番はPostgreSQLで
現在約4万件、日々データが増えているので
PostgreSQLのSQL文で実行したいです。
自己結合クエリとか再帰クエリで
書けるのかな?と思うのですが
わかりません。

該当のソースコード

ACCESS VBA
ソースコード

Option Compare Database Sub 順次処理() 'ADOを使うための変数宣言 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim int_min_Group As Integer 'SQL文を格納するための変数宣言 Dim strSQL As String Dim strFLD As String DoCmd.SetWarnings False 'GroupフィールドNOセット strSQL = "UPDATE TEST SET TEST.Group = TEST.NO" DoCmd.RunSQL strSQL strSQL = "SELECT TEST.NO,TEST.FLD1,TEST.FLD2 FROM TEST ORDER BY TEST.NO" 'カレントデータベースに接続する。 Set cn = CurrentProject.Connection 'SQL文を開く rs.Open strSQL, cn '先頭レコードに移動 rs.MoveFirst Do Until rs.EOF = True 'イミディエイトウィンドウに値を表示 strFLD = " (""" & rs.Fields(1) & """,""" & rs.Fields(2) & """)" strSQL = "(TEST.FLD1 in" & strFLD & " OR TEST.FLD2 in" & strFLD & ") AND NO <= " & rs.Fields(0) 'グループ番号の最小値を求める int_min_Group = DMin("Group", "TEST", strSQL) 'グループ番号を最小値で更新 strSQL = "UPDATE TEST SET TEST.Group = " & int_min_Group & " WHERE TEST.NO = " & rs.Fields(0) DoCmd.RunSQL strSQL '次のレコードに移動する。 rs.MoveNext Loop 'レコードセットを閉じる。 rs.Close 'データベース接続を閉じる。 cn.Close Set cn = Nothing DoCmd.SetWarnings True End Sub

試したこと

WITH RECURSIVEの親子構造の扱いを見てみましたが
それとはちょっと違うような―

SQLで実現できるでしょうか
どうぞよろしくお願いいたします。<(_ _)>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

kikukiku

2022/09/21 02:04

ストアドプロシージャを勉強して使ってみたらどうでしょう。 ループも簡単にできますし。
YT0014

2022/09/21 10:30

対象のPostgreSQLのバージョンをご提示ください。
LAVENDER

2022/09/21 22:55

>kikukikuさま ありがとうございます。 SQLServerのストアドプロシージャは 長年経験あります。 PostgreSQLはまだ駆け出しです。 でも同じように使えそうですね。 勉強してみます。 >YT0014さま psql (PostgreSQL) 14.0です。 再帰SQLのご提案ありがとうございます。 会議が終わりましたら、本日の午後から 試してみたいと思います。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PostgreSQL

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

SQL

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

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。