我正在使用 MySQL Workbench 8.0。
我将我的问题分成两部分,因为我相信第一部分很简单(但稍微超出我目前的 SQL 知识水平),但第二部分可能不是那么简单。
问题 1
我有以下源数据:
密钥 | 属性1 | 属性2 | 数据1 | 数据2 |
---|---|---|---|---|
0 | A | C | 1 | 14 |
1 | A | C | 2 | 16 |
2 | A | C | 3 | 四十四 |
3 | A | 德 | 1 | 91 |
4 | A | 德 | 2 | 9 |
5 | A | 德 | 3 | 71 |
6 | 乙 | C | 1 | 31 |
7 | 乙 | C | 2 | 3 |
8 | 乙 | C | 3 | 三十八 |
9 | 乙 | 德 | 1 | 1 |
10 | 乙 | 德 | 2 | 111 |
11 | 乙 | 德 | 3 | 三十 |
attr1
并且attr2
每个都有两个可能的值。attr1
可以取值A和乙.attr2
可以取以下值C和德。因此,这两个字段作为一对合在一起有四个可能的值:交流,广告,公元前,屋宇署。
data1
可以取 N 个不同的值,但为了使示例简单,上面只显示了三个。下面针对我的问题提供的任何解决方案都不应假设data1
仅限于 1 - 3 范围内的值。
作为第一步,我想编写一个基于(attr1
,attr2
)对将行转换为列的查询交流,广告,公元前,屋宇署, 如下:
数据1 | 交流 | 广告 | 公元前 | 屋宇署 |
---|---|---|---|---|
1 | 14 | 91 | 31 | 1 |
2 | 16 | 9 | 3 | 111 |
3 | 四十四 | 71 | 三十八 | 三十 |
这个问题陈述中隐含的是元组值(attr1
,,attr2
)data1
是唯一的。
我怎样才能编写一个 SQL 查询来实现这一点?
问题第 2 部分
我所面临的问题中更具挑战性的部分是元组值(attr1
,,)实际上并不唯一,正如上面第 1 部分所假设的那样attr2
。data1
以下是我的数据的更准确表示:
密钥 | 属性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 | 四十四 | 2024-01-01 13:00:00 |
3 | A | 德 | 1 | 91 | 2024-01-01 13:00:01 |
4 | A | 德 | 2 | 9 | 2024-01-01 13:00:02 |
5 | A | 德 | 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 | 三十八 | 2024-01-01 13:00:02 |
9 | 乙 | 德 | 1 | 1 | 2024-01-01 13:00:03 |
10 | 乙 | 德 | 2 | 111 | 2024-01-01 13:00:03 |
11 | 乙 | 德 | 3 | 三十 | 2024-01-01 13:00:03 |
12 | A | C | 1 | 66 | 2024-03-21 09:57:20 |
十三 | A | C | 2 | 23 | 2024-03-21 09:57:20 |
14 | A | C | 3 | 54 | 2024-03-21 09:57:21 |
15 | A | 德 | 1 | 19 | 2024-03-21 09:57:21 |
16 | A | 德 | 2 | 18 | 2024-03-21 09:57:21 |
17 | A | 德 | 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 | 乙 | 德 | 1 | 10 | 2024-03-21 09:57:23 |
22 | 乙 | 德 | 2 | 83 | 2024-03-21 09:57:23 |
23 | 乙 | 德 | 3 | 十三 | 2024-03-21 09:57:23 |
现在可以看出,( attr1
, attr2
, data1
) 元组可以出现多次。在上述情况下,每个可能的元组都会出现两次(尽管对于此类元组可以出现多少次并没有固定的限制)。
我希望我尝试开发的查询返回以下内容:
数据1 | 交流 | 广告 | 公元前 | 屋宇署 |
---|---|---|---|---|
1 | 14 | 91 | 31 | 1 |
2 | 16 | 9 | 3 | 111 |
3 | 四十四 | 71 | 三十八 | 三十 |
1 | 66 | 19 | 87 | 10 |
2 | 23 | 18 | 19 | 83 |
3 | 54 | 33 | 9 | 十三 |
问题在于知道AC
、AD
、BC
和中的哪些值BD
应该与 的值分组在一起data1
。例如,除了上面显示的期望分组之外,data1
还可以选择 = 1 的以下(不正确的)分组:
数据1 | 交流 | 广告 | 公元前 | 屋宇署 |
---|---|---|---|---|
1 | 14 | 19 | 31 | 10 |
1 | 66 | 91 | 87 | 1 |
我唯一需要正确形成分组的就是字段RecCreated
。时间上“接近”的值应该分组在一起。当然,这需要定义“接近”。为了便于理解,我们将组定义为一组值,这些值在3分钟RecCreated
基于领域的相互
我怎样才能编写一个 SQL 查询来实现这一点?