我有一个垂直存储数据的表格,我在下面显示了一个简化示例,其中包含客户所居住的每个城市的记录:
| CUSTOMER | CITY |
------------------------------
| John | London |
| John | Manchester |
| Sarah | Cardiff |
| Sarah | Edinburgh |
| Sarah | Liverpool |
| Craig | Manchester |
| Craig | London |
我正在尝试提出一个SQL查询,它将返回所有独特的城市组合,所以在上面的例子中,John和Craig都住在伦敦和曼彻斯特,但Sarah住在不同的城市(卡迪夫,爱丁堡和利物浦) )所以我想要一个输出如下(可以处理任何数量的城市)
| CITY1 | CITY2 | CITY3 |
--------------------------------------------
| London | Manchester | |
| Cardiff | Edinburgh | Liverpool |
我尝试使用交叉表查询水平查看数据:
TRANSFORM Max(City)
SELECT Customer
FROM tblCities
GROUP BY Customer
PIVOT City
但它只是为每个客户返回所有城市的字段。有谁知道这是否可以使用SQL?
p.s理想情况下,它将忽略城市的顺序
答案 0 :(得分:1)
这是你想要的吗?
select distinct c1.city, c2.city
from tblCities as c1 inner join
tblCities as c2
on c1.customer = c2.customer and c1.city < c2.city;
这将返回为任何单个客户显示的所有城市对。
答案 1 :(得分:1)
这是一个可能有效的查询,假设每个客户只与两个城市相关联:
SELECT DISTINCT t.city_1, t.city_2
FROM
(
SELECT MIN(CITY) AS city_1, MAX(CITY) AS city_2
FROM tblCities
GROUP BY CUSTOMER
) t
答案 2 :(得分:1)
这是一个很好的挑战!下面的查询获得每个客户的分组。它不会丢弃多个客户住在同一城市组合中的重复项......我会让你或其他人找到办法来解决这个问题。
spark.implicits._