有一个 table 具有国家和城市列,如下面的 table 输入所示。我需要如下所述的输出
There is a table having country and city columns as shown in the below table input. I need the output as mentioned below
我需要一个 SQL 查询来从输入 table
中获得所需的输出
看来你真的愿意交错记录,每个国家后面都有它的相关国家。
实际解决方案在很大程度上取决于您的数据集,所以我假设您的数据集支持 window 函数、行构造函数 values()
和横向连接(SQL Server 和 Postgres 是两个候选者).
在SQL服务器中,你可以这样做:
select distinct rn, idx, val
from (
select t.*, dense_rank() over(order by country) rn
from mytable t
) t
cross apply (values (t.country, 1), (t.city, 2)) as v(val, idx)
order by rn, idx, val
rn | idx | val
-: | --: | :-----
1 | 1 | INDIA
1 | 2 | BNG
1 | 2 | CHN
1 | 2 | HYD
2 | 1 | SWEDEN
2 | 2 | STOCK
2 | 2 | VAXO
在 Postgres 中,您只需将 outer apply
替换为 cross join lateral
:Demo.
您可以使用 UNION
查询来执行此操作,首先选择不同的国家/地区名称,然后选择该国家/地区的每个城市。然后输出由国家订购;该值是国家还是城市;然后按值:
SELECT DISTINCT country AS data, country, 1 AS ctry
FROM cities
UNION ALL
SELECT city, country, 0
FROM cities
ORDER BY country, ctry DESC, data
输出:
data country ctry
India India 1
BNG India 0
CHN India 0
HYD India 0
Sweden Sweden 1
GOTH Sweden 0
STOCK Sweden 0
VAXO Sweden 0
我需要一个 SQL 查询来从输入 table
中获得所需的输出看来你真的愿意交错记录,每个国家后面都有它的相关国家。
实际解决方案在很大程度上取决于您的数据集,所以我假设您的数据集支持 window 函数、行构造函数 values()
和横向连接(SQL Server 和 Postgres 是两个候选者).
在SQL服务器中,你可以这样做:
select distinct rn, idx, val
from (
select t.*, dense_rank() over(order by country) rn
from mytable t
) t
cross apply (values (t.country, 1), (t.city, 2)) as v(val, idx)
order by rn, idx, val
rn | idx | val -: | --: | :----- 1 | 1 | INDIA 1 | 2 | BNG 1 | 2 | CHN 1 | 2 | HYD 2 | 1 | SWEDEN 2 | 2 | STOCK 2 | 2 | VAXO
在 Postgres 中,您只需将 outer apply
替换为 cross join lateral
:Demo.
您可以使用 UNION
查询来执行此操作,首先选择不同的国家/地区名称,然后选择该国家/地区的每个城市。然后输出由国家订购;该值是国家还是城市;然后按值:
SELECT DISTINCT country AS data, country, 1 AS ctry
FROM cities
UNION ALL
SELECT city, country, 0
FROM cities
ORDER BY country, ctry DESC, data
输出:
data country ctry
India India 1
BNG India 0
CHN India 0
HYD India 0
Sweden Sweden 1
GOTH Sweden 0
STOCK Sweden 0
VAXO Sweden 0