根据名称的长度从临时表中删除重复的城市名称。
以下查询返回350,000行:
select
tc.id,
tc.name_lowercase,
tc.population,
tc.latitude_decimal,
tc.longitude_decimal
from
climate.temp_city tc
inner join (
select
tc2.latitude_decimal,
tc2.longitude_decimal
from
climate.temp_city tc2
group by
tc2.latitude_decimal,
tc2.longitude_decimal
having
count(*) > 3
) s on
tc.latitude_decimal = s.latitude_decimal and
tc.longitude_decimal = s.longitude_decimal
示例数据:
940308;"sara" ;;-53.4333333;-68.1833333
935665;"estancia la sara";;-53.4333333;-68.1833333
935697;"estancia sara" ;;-53.4333333;-68.1833333
937204;"la sara" ;;-53.4333333;-68.1833333
940350;"seccion gap" ;;-52.1666667;-68.5666667
941448;"zanja pique" ;;-52.1666667;-68.5666667
935941;"gap" ;;-52.1666667;-68.5666667
935648;"estancia gap" ;;-52.1666667;-68.5666667
939635;"ritchie" ;;-51.9833333;-70.4
934948;"d.e. ritchie" ;;-51.9833333;-70.4
934992;"diego richtie" ;;-51.9833333;-70.4
934993;"diego ritchie" ;;-51.9833333;-70.4
934990;"diego e. ritchie";;-51.9833333;-70.4
我想删除所有重复项,保留以下行:
max(tc.name_lowercase)
);和max(tc.id)
。从给定的数据集中,剩余的行将是:
935665;"estancia la sara";;-53.4333333;-68.1833333
935648;"estancia gap" ;;-52.1666667;-68.5666667
934990;"diego e. ritchie";;-51.9833333;-70.4
您如何仅选择具有满足问题标准的重复纬度/经度值的行?
谢谢!
答案 0 :(得分:1)
我认为你正在寻找这样的东西:
SELECT t.id, t.name_lowercase, t.latitude_decimal, t.longitude_decimal
FROM (SELECT MAX(LENGTH(name_lowercase)) AS len, latitude_decimal, longitude_decimal FROM temp_city GROUP BY latitude_decimal, lng) AS max_length,
temp_city t
WHERE max_length.latitude_decimal = t.latitude_decimal
AND max_length.longitude_decimal = t.longitude_decimal
AND max_length.len = LENGTH(t.name_lowercase);
其中temp_city
是包含示例结果的表格。
如果您的temp_city
也包含此行,则上述问题会遇到问题:
1 | xxxancia la sara | -53.4333333 | -68.1833333
您没有提供一种方法来从name
具有最大长度的那些行中选择哪一行,因此将返回这两行:
1 | xxxancia la sara | -53.4333333 | -68.1833333
935665 | estancia la sara | -53.4333333 | -68.1833333
更新:如果max(tc.id)
是修剪上述重复项的额外条件,那么您可以打开另一个图层:
SELECT t.id, t.name_lowercase, t.latitude_decimal, t.longitude_decimal
FROM
(
SELECT MAX(t.id) AS id
FROM
(
SELECT MAX(LENGTH(name_lowercase)) AS len, latitude_decimal, longitude_decimal
FROM temp_city
GROUP BY latitude_decimal, longitude_decimal
) AS max_length,
temp_city t
WHERE max_length.latitude_decimal = t.latitude_decimal
AND max_length.longitude_decimal = t.longitude_decimal
AND max_length.len = LENGTH(t.name_lowercase)
GROUP BY t.latitude_decimal, t.longitude_decimal, LENGTH(t.name_lowercase)
) AS tt,
temp_city t
WHERE t.id = tt.id