Sql 如何透视表并通过值进行计数?
我在一个名为measurements的表中有两列:mac_address和space。 每行显示一个mac_地址和检测到它的位置 它可以有重复 我想做的是查看空间之间共享了多少mac_地址。 我尝试这样做:Sql 如何透视表并通过值进行计数?,sql,amazon-athena,Sql,Amazon Athena,我在一个名为measurements的表中有两列:mac_address和space。 每行显示一个mac_地址和检测到它的位置 它可以有重复 我想做的是查看空间之间共享了多少mac_地址。 我尝试这样做: Space 1 | Space 2 | mac_adress 第1列和第2列包含所有可能的空格组合。mac_地址列包含这两个空间之间所有唯一共享mac地址的总和。 这个问题困扰了我一段时间。我尝试使用分组和案例实现一个解决方案,但结果与我想要的不一样 谢谢:) 注意:我正在使用AWS的At
Space 1 | Space 2 | mac_adress
第1列和第2列包含所有可能的空格组合。mac_地址列包含这两个空间之间所有唯一共享mac地址的总和。
这个问题困扰了我一段时间。我尝试使用分组和案例实现一个解决方案,但结果与我想要的不一样
谢谢:)
注意:我正在使用AWS的Athena,因此我无法使用Pivot等模块来获得您要查找的结果。需要使用mac\u地址将测量值表自身连接起来,我们需要对空间进行排序,以便只返回两个空间组合的一个版本
WITH measurements AS (
SELECT 'room1' AS space, 'a1' AS mac_address
UNION
SELECT 'room1' AS space, 'a2' AS mac_address
UNION
SELECT 'room2' AS space, 'a1' AS mac_address
UNION
SELECT 'room3' AS space, 'a1' AS mac_address
UNION
SELECT 'room3' AS space, 'a2' AS mac_address
)
SELECT
LEAST(m1.space, m2.space) AS space_1,
GREATEST(m1.space, m2.space) AS space_2,
COUNT(DISTINCT m1.mac_address) AS mac_addresses
FROM measurements AS m1
JOIN measurements AS m2 ON m1.mac_address = m2.mac_address
WHERE
m1.space != m2.space
GROUP BY 1,2;
measurements
CTE创建的虚拟数据与您描述表格的方式类似:
| space | mac_address |
|-------|-------------|
| room1 | a1 |
| room1 | a2 |
| room2 | a1 |
| room3 | a1 |
| room3 | a2 |
从这些数据中,我们可以看到room1/room2空间组合只有一个唯一的mac\U地址(a1
),room1/room3有两个唯一的组合(a1
,a2
),room2/room3有一个唯一的组合(a1
)
因为我们加入了测量本身,所以我们使用最大
和最小
来确保我们只计算room1/room2
,而不计算room2/room1
。按“空间”算你是指房间吗?还是一个地点?或者一个城市/一个地址?一个像商店这样的房间(例如:)