我在一个名为measurements的表中有2列:mac_address和space。 每行显示一个mac_address以及检测到它的位置。
它可以重复。
我想要做的是查看空格之间共享多少个mac_addresses。 我尝试做这样的事情:
Space 1 | Space 2 | mac_adress
第1列和第2列包含所有可能的空格组合。 mac_adress列包含这两个空格之间所有唯一共享mac地址的总和。
这个问题我已经被困了一段时间了。我尝试使用GROUP BY and CASE
实现解决方案,但它与我想要的结果不相似。
谢谢:)
注意: 我正在使用AWS的Athena,因此我无法使用像Pivot这样的模块
答案 0 :(得分:1)
要获得结果,您需要使用measurements
将mac_address
表自身连接起来,并且我们需要对空格进行排序,以便仅使用两个空格组合的一个版本回到。
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 space
组合只有一个唯一的mac_address
(a1
),room1 / room3有两个唯一的组合({{1} },a1
)和room2 / room3具有一个唯一的组合(a2
)。
由于我们自己要加入a1
,因此我们使用measurements
和GREATEST
来确保我们只计算LEAST
而不计算room1/room2
。 / p>