MySQL:根據欄位值將行轉換為列

MySQL:根據欄位值將行轉換為列

我正在使用 MySQL Workbench 8.0。

我將把我的問題分成兩部分,因為我相信第一部分會很簡單(但稍微超出我目前的 SQL 知識水平),但第二部分可能不那麼簡單。

問題第 1 部分

我有以下來源資料:

金鑰 屬性1 屬性2 數據1 數據2
0 A C 1 14
1 A C 2 16
2 A C 3 44
3 A D 1 91
4 A D 2 9
5 A D 3 71
6 C 1 31
7 C 2 3
8 C 3 38
9 D 1 1
10 D 2 111
11 D 3 30

attr1每個attr2都有兩個可能的值。attr1可以採用以下值Aattr2可以採用以下值CD。因此,這兩個欄位作為一對組合在一起有四個可能的值:交流電,廣告,西元前,BD

data1可以採用 N 個不同的值,儘管為了保持範例簡單,上面只顯示了三個。以下針對我的問題提供的任何解決方案不應假定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 部分中假設的那樣唯一。

這是我的數據更準確的表示:

金鑰 屬性1 屬性2 數據1 數據2 重新創建
0 A C 1 14 2024-01-01 13:00:00
1 A C 2 16 2024-01-01 13:00:00
2 A C 3 44 2024-01-01 13:00:00
3 A D 1 91 2024-01-01 13:00:01
4 A D 2 9 2024-01-01 13:00:02
5 A D 3 71 2024-01-01 13:00:02
6 C 1 31 2024-01-01 13:00:02
7 C 2 3 2024-01-01 13:00:02
8 C 3 38 2024-01-01 13:00:02
9 D 1 1 2024-01-01 13:00:03
10 D 2 111 2024-01-01 13:00:03
11 D 3 30 2024-01-01 13:00:03
12 A C 1 66 2024-03-21 09:57:20
13 A C 2 23 2024-03-21 09:57:20
14 A C 3 54 2024-03-21 09:57:21
15 A D 1 19 2024-03-21 09:57:21
16 A D 2 18 2024-03-21 09:57:21
17 號 A D 3 33 2024-03-21 09:57:22
18 C 1 87 2024-03-21 09:57:22
19 C 2 19 2024-03-21 09:57:22
20 C 3 9 2024-03-21 09:57:22
21 D 1 10 2024-03-21 09:57:23
22 D 2 83 2024-03-21 09:57:23
23 D 3 13 2024-03-21 09:57:23

現在可以看出,( attr1, attr2, data1) 元組可以出現多次。在上面的情況下,每個可能的元組出現兩次(儘管這樣的元組可以出現的次數沒有固定限制)。

我希望我嘗試開發的查詢返回以下內容:

數據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

問題是知道ACADBC和的哪些值BD應該與給定值 分組在一起data1。例如,data1可以選擇 = 1 的以下(不正確)分組,而不是上面顯示的所需分組:

數據1 交流電 廣告 西元前 BD
1 14 19 31 10
1 66 91 87 1

我唯一需要正確形成分組的就是欄位RecCreated。時間上「接近」的值應分組在一起。當然,這需要定義「緊密結合」。出於本文的目的,我們將群組定義為範圍內的值的集合3分鐘彼此基於RecCreated領域。

我該如何編寫 SQL 查詢來完成此任務?

相關內容