MySQL: フィールド値に基づいて行を列に変換する

MySQL: フィールド値に基づいて行を列に変換する

MySQL Workbench 8.0 を使用しています。

最初の部分は簡単だと思いますが (ただし、私の現在の SQL の知識レベルを少し超えています)、2 番目の部分はそれほど簡単ではない可能性があるため、質問を 2 つの部分に分けます。

質問パート1

次のソースデータがあります:

Pキー 属性1 属性2 データ1 データ2
0 1 14
1 2 16
2 3 44
3 1 91
4 2 9
5 3 71
6 B 1 31
7 B 2 3
8 B 3 38
9 B 1 1
10 B 2 111
11 B 3 30

attr1それぞれ2つの値を取ることができますattr2attr1そしてB.attr2は次のような値を取ることができますそしてしたがって、これら 2 つのフィールドをペアとして組み合わせると、次の 4 つの値が得られます。交流広告紀元前BD

data1は N 個の異なる値を取ることができますが、例を単純にするために、上記では 3 つの値のみを示しています。以下の私の質問に対する解決策では、 がdata11 ~ 3 の範囲の値に限定されると想定しないでください。

attr1最初のステップとして、( 、attr2)ペアに基づいて行を列に変換するクエリを書きたいと思います。交流広告紀元前BD、 次のように:

データ1 交流 広告 紀元前 BD
1 14 91 31 1
2 16 9 3 111
3 44 71 38 30

この問題の説明では、タプルの値 ( attr1、、) が一意であることが暗黙的attr2に示されています。data1

これを実現する SQL クエリをどのように記述すればよいでしょうか?

質問パート2

私が直面している問題のより難しい部分は、タプルの値 ( attr1attr2data1) が、上記のパート 1 で想定されていたように実際には一意ではないことです。

私のデータをより正確に表現したものがこちらです:

Pキー 属性1 属性2 データ1 データ2 再作成
0 1 14 2024-01-01 13:00:00
1 2 16 2024-01-01 13:00:00
2 3 44 2024-01-01 13:00:00
3 1 91 2024-01-01 13:00:01
4 2 9 2024-01-01 13:00:02
5 3 71 2024-01-01 13:00:02
6 B 1 31 2024-01-01 13:00:02
7 B 2 3 2024-01-01 13:00:02
8 B 3 38 2024-01-01 13:00:02
9 B 1 1 2024-01-01 13:00:03
10 B 2 111 2024-01-01 13:00:03
11 B 3 30 2024-01-01 13:00:03
12 1 66 2024-03-21 09:57:20
13 2 23 2024-03-21 09:57:20
14 3 54 2024-03-21 09:57:21
15 1 19 2024-03-21 09:57:21
16 2 18 2024-03-21 09:57:21
17 3 33 2024-03-21 09:57:22
18 B 1 87 2024-03-21 09:57:22
19 B 2 19 2024-03-21 09:57:22
20 B 3 9 2024-03-21 09:57:22
21 B 1 10 2024-03-21 09:57:23
22 B 2 83 2024-03-21 09:57:23
23 B 3 13 2024-03-21 09:57:23

ご覧のとおり、( attr1attr2data1) タプルは複数回出現する可能性があります。上記のケースでは、各可能なタプルが 2 回出現します (ただし、このようなタプルが出現できる回数には固定の制限はありません)。

私が開発しようとしているクエリでは、次の結果が返されるようにしたいと思います。

データ1 交流 広告 紀元前 BD
1 14 91 31 1
2 16 9 3 111
3 44 71 38 30
1 66 19 87 10
2 23 18 19 83
3 54 33 9 13

問題は、、、、のどの値を の特定の値と一緒にグループ化するかを知ることです。ACたとえば、上に示した望ましいグループ化の代わりに、= 1 に対して次の (誤った) グループ化が選択された可能性があります。ADBCBDdata1data1

データ1 交流 広告 紀元前 BD
1 14 19 31 10
1 66 91 87 1

グループ化を正しく行うために必要なのはフィールドだけですRecCreated。時間的に「近い」値はグループ化する必要があります。もちろん、これには「近い」を定義する必要があります。この記事では、グループを次の範囲内にある値の集合として定義します。3分分野に基づいて互いに異なりますRecCreated

これを実現する SQL クエリをどのように記述すればよいでしょうか?

関連情報