如何透视表并计算值?

时间:2017-07-03 13:49:41

标签: sql amazon-athena

我在一个名为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这样的模块

1 个答案:

答案 0 :(得分:1)

要获得结果,您需要使用measurementsmac_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_addressa1),room1 / room3有两个唯一的组合({{1} },a1)和room2 / room3具有一个唯一的组合(a2)。

由于我们自己要加入a1,因此我们使用measurementsGREATEST来确保我们只计算LEAST而不计算room1/room2。 / p>