【问题标题】:How do I query for records with multiple values for the last column in a compound GROUP BY clause?如何查询复合 GROUP BY 子句中最后一列具有多个值的记录?
【发布时间】:2010-11-30 17:39:34
【问题描述】:

给定的数据看起来与此类似:

+---------+-----------+----------+
| country | city      | district |
+---------+-----------+----------+
| Japan   | Tokyo     | 1        |
| Japan   | Tokyo     | 1        |
| Japan   | Tokyo     | 2        |
| China   | Shanghai  | A        |
| China   | Shanghai  | A        |
| China   | Shanghai  | A        |
| China   | Beijing   | X        |
| China   | Beijing   | Y        |
| China   | Beijing   | Z        |
| India   | Mumbai    | 123      |
| India   | Mumbai    | 123      |
| India   | Mumbai    | 123      |
| India   | New Delhi | 321      |
| India   | New Delhi | 321      |
| India   | New Delhi | 321      |
+---------+-----------+----------+

我知道我可以通过以下方式直观地获取数据:

SELECT * from that_table
GROUP BY country, city, district

我会得到:

+---------+-----------+----------+
| country | city      | district |
+---------+-----------+----------+
| Japan   | Tokyo     | 1        |
| Japan   | Tokyo     | 2        |
| China   | Shanghai  | A        |
| China   | Beijing   | X        |
| China   | Beijing   | Y        |
| China   | Beijing   | Z        |
| India   | Mumbai    | 123      |
| India   | New Delhi | 321      |
+---------+-----------+----------+

我可以看到只有 Japan/Tokyo 和 China/Beijing 有多个 District 值。但是,我有大量数据源,我想用 SQL 来做。

如何形成 SQL 查询以获取具有多个地区的所有国家/城市组合?

我想要实现的输出是:

+---------+-----------+----------+
| country | city      | district |
+---------+-----------+----------+
| Japan   | Tokyo     | 1        |
| Japan   | Tokyo     | 2        |
| China   | Beijing   | X        |
| China   | Beijing   | Y        |
| China   | Beijing   | Z        |
+---------+-----------+----------+

【问题讨论】:

  • 为什么源数据中有这么多重复记录?说三遍(例如 )并不能使它变得更真实。
  • 在您的情况下,选择 * 非常糟糕,尤其是使用 group by。我很少使用 select *,我只用它来查询表的信息,从不在实际代码中。
  • 我无法控制源数据。数据来自我只有只读权限的旧应用程序的数据库。

标签: sql mysql group-by


【解决方案1】:

您可以添加一个条件,即同一城市必须至少有一个不同名称的区:

SELECT a.*
FROM YourTable a
WHERE EXISTS (
    SELECT *
    FROM YourTable b
    WHERE a.Country = b.Country
    AND a.City = b.City
    AND a.District <> b.District
)

【讨论】:

    【解决方案2】:
    SELECT a.*
    FROM foo a
      JOIN (
        SELECT country, city
        FROM (SELECT distinct country, city, district FROM foo)
        GROUP BY country, city
        HAVING count(country) > 1) b
      ON a.city = b.city AND a.country = b.country
    GROUP BY a.country, a.city, a.district
    

    结果:

    COUNTRY CITY    DISTRICT
    Japan   Tokyo   2
    Japan   Tokyo   1
    China   Beijing Z
    China   Beijing Y
    China   Beijing X
    

    【讨论】:

    • 在验证了每个建议的答案后,只有这个答案为我提供了正确的输出。谢谢! :)
    【解决方案3】:
    SELECT DISTINCT country, city, district FROM that_table tt1
                  JOIN (
                        SELECT country, city  from that_table
                        GROUP BY country, city
                        HAVING count(1) > 1) tt2
                  ON tt1.city = tt2.city
                  AND tt1.Country = tt2.country
    

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多