我有一张表格如下:
City1 City2 Distance
A B 500
C D 400
E F 800
F E 800
我的输出应该如下:
City1 City2 Distance
A B 500
C D 400
E F 800
你能帮我写一个sql吗?
城市秩序无关紧要。只需要一个独特的组合。 这里(F,E,800)也将在最终输出中进行。
答案 0 :(得分:1)
您可能希望删除任意两个城市的重复对,无论这些城市的显示顺序如何。不清楚的是您希望保留哪个Distance
值。假设您可以保留最大距离,可以尝试以下查询:
SELECT
CASE WHEN City1 < City2 THEN City1 ELSE City2 END AS City1,
CASE WHEN City2 < City1 THEN City1 ELSE City2 END AS City2,
MAX(Distance) AS Distance
FROM yourTable
GROUP BY
CASE WHEN City1 < City2 THEN City1 ELSE City2 END,
CASE WHEN City2 < City1 THEN City2 ELSE City1 END
请注意,我尽可能地给出了答案,因为您从未告诉我们您使用的是哪个版本的SQL。这个查询可以在MySQL,Postgres和其他几个方面进行一些简化。
以下是MySQL中正在运行的演示:
答案 1 :(得分:0)
;
WITH cte
AS (
SELECT ROW_NUMBER() OVER (
PARTITION BY /* based on what? can be multiple columns*/
ORDER BY (
SELECT 0
)
) RN
FROM yourtable
)
DELETE
FROM cte
WHERE RN > 1
答案 2 :(得分:0)
使用case
表达式始终将第一个城市放在第一列,将最后一个城市放在第二列。然后执行SELECT DISTINCT
删除重复的行:
select distinct case when City1 < City2 then City1 else City2 end,
case when City1 > City2 then City1 else City2 end,
distance
from tablename
答案 3 :(得分:0)
一种适用于数据库和的方法可以保证输出中唯一的值在原始表中是使用union all
:
select t.*
from t
where city1 < city2
union all
select t.*
from t
where city1 > city2 and
not exists (select 1
from t t2
where t2.city1 = t1.city2 and t2.city2 = t1.city1
);
请注意,如果表格中有重复项,则应使用union
而不是union all
。此外,如果距离不同,您可能需要考虑距离。