
MySQL Workbench 8.0 を使用しています。
最初の部分は簡単だと思いますが (ただし、私の現在の SQL の知識レベルを少し超えています)、2 番目の部分はそれほど簡単ではない可能性があるため、質問を 2 つの部分に分けます。
質問パート1
次のソースデータがあります:
Pキー | 属性1 | 属性2 | データ1 | データ2 |
---|---|---|---|---|
0 | あ | C | 1 | 14 |
1 | あ | C | 2 | 16 |
2 | あ | C | 3 | 44 |
3 | あ | だ | 1 | 91 |
4 | あ | だ | 2 | 9 |
5 | あ | だ | 3 | 71 |
6 | B | C | 1 | 31 |
7 | B | C | 2 | 3 |
8 | B | C | 3 | 38 |
9 | B | だ | 1 | 1 |
10 | B | だ | 2 | 111 |
11 | B | だ | 3 | 30 |
attr1
それぞれ2つの値を取ることができますattr2
。attr1
あそしてB.attr2
は次のような値を取ることができますCそしてだしたがって、これら 2 つのフィールドをペアとして組み合わせると、次の 4 つの値が得られます。交流、広告、紀元前、BD。
data1
は N 個の異なる値を取ることができますが、例を単純にするために、上記では 3 つの値のみを示しています。以下の私の質問に対する解決策では、 がdata1
1 ~ 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
私が直面している問題のより難しい部分は、タプルの値 ( attr1
、attr2
、data1
) が、上記のパート 1 で想定されていたように実際には一意ではないことです。
私のデータをより正確に表現したものがこちらです:
Pキー | 属性1 | 属性2 | データ1 | データ2 | 再作成 |
---|---|---|---|---|---|
0 | あ | C | 1 | 14 | 2024-01-01 13:00:00 |
1 | あ | C | 2 | 16 | 2024-01-01 13:00:00 |
2 | あ | C | 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 | C | 1 | 31 | 2024-01-01 13:00:02 |
7 | B | C | 2 | 3 | 2024-01-01 13:00:02 |
8 | B | C | 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 | あ | C | 1 | 66 | 2024-03-21 09:57:20 |
13 | あ | C | 2 | 23 | 2024-03-21 09:57:20 |
14 | あ | C | 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 | C | 1 | 87 | 2024-03-21 09:57:22 |
19 | B | C | 2 | 19 | 2024-03-21 09:57:22 |
20 | B | C | 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 |
ご覧のとおり、( attr1
、attr2
、data1
) タプルは複数回出現する可能性があります。上記のケースでは、各可能なタプルが 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 に対して次の (誤った) グループ化が選択された可能性があります。AD
BC
BD
data1
data1
データ1 | 交流 | 広告 | 紀元前 | BD |
---|---|---|---|---|
1 | 14 | 19 | 31 | 10 |
1 | 66 | 91 | 87 | 1 |
グループ化を正しく行うために必要なのはフィールドだけですRecCreated
。時間的に「近い」値はグループ化する必要があります。もちろん、これには「近い」を定義する必要があります。この記事では、グループを次の範囲内にある値の集合として定義します。3分分野に基づいて互いに異なりますRecCreated
。
これを実現する SQL クエリをどのように記述すればよいでしょうか?