如何识别使用 COUNT() 聚合的非相同值?

How to identify non-identical values being aggregated with COUNT()?

我有一个 table 包含三列:城市 ID、语言代码和城市:

city_id | language_code | city
----------------------------------
1       | en            | London
1       | es            | Londres
1       | pt            | Londres
2       | de            | Köln
2       | en            | Cologne
3       | it            | Cologne

在某些外语中,城市的拼写方式相同,例如伦敦的西班牙语和葡萄牙语名称是 Londres.

但在某些情况下,相同的名称可以指代完全不同的位置,例如Cologne 是德国城市科隆的英文名称,但在意大利也有一个同名的小镇。

我希望能够检测到 table 中有多个条目的城市,但只能检测到链接到不同 city_id 值的城市。在我的例子中,这将是 Cologne 但不是 Londres 因为 espt 语言版本都指向相同的 city_id.

我认为这将是一件相当容易的事情,但我无法在单个查询中获得结果。相反,我首先对结果进行重复数据删除,然后汇总它们:

WITH deduped_cities AS (
  SELECT DISTINCT city, city_id
  FROM cities
  ORDER BY city
)
SELECT city, COUNT(city_id) AS total
FROM deduped_cities
GROUP BY city
HAVING COUNT(city_id) > 1;

这给了我预期的结果:

city    | total
----------------
Cologne | 2

我只是想知道是否可以用一条 SELECT 语句达到同样的效果。

DB Fiddle

您基本上只有一个 SELECT,但您可以将 DISTINCT' 与 COUNT

一起使用
SELECT city, COUNT(city_id) AS total
FROM cities
GROUP BY city
HAVING COUNT( DISTINCT city_id) > 1;

fiddle

我相信你可以在聚合和 having 子句中做不同的:

select city, count (distinct city_id)
from cities
group by city
having count (distinct city_id) > 1