【问题标题】:Returning both a duplicate count and distinct rows返回重复计数和不同的行
【发布时间】:2015-04-05 23:12:15
【问题描述】:

我正在编写一个用作 PL/SQL 游标的 SQL 语句,它根据邮局提供的 POSTCODES 表检查 SUBURB 字段。绝大多数郊区将只有一个邮政编码,但是:

  • 部分郊区拼写错误,与邮政编码不符;
  • 一些郊区有多个邮政编码

为了避免不必要地访问数据库,并避免在我的结果中出现重复的地址,如果有一个与郊区对应的邮政编码,我想返回一个 POSTCODE 值,否则返回 null,并且 CODES_IN_SUBURB 计数为 null如果未找到该郊区,则计算该郊区有多少个不同的邮政编码。

我想我已经很接近了,但我在不重复自己的情况下如何修改 CODES_IN_SUBURB 一半的此语句时遇到了一些麻烦。如果我在没有 count = 1 WHERE 子句的情况下加入,我会得到重复的地址。如果我把它留在里面,我就不能以我想要的方式使用 CODES_IN_SUBURB。解决这个问题的最佳方法是什么?

SELECT  dirty_data.street1,
        dirty_data.suburb, 
        nsw_postcodes.postcode
FROM dirty_data 
LEFT JOIN ( SELECT postcodes.locality, postcode, dupes.codes_in_suburb 
            FROM postcodes
            INNER JOIN (SELECT locality, count(*) codes_in_suburb 
                        FROM postcodes 
                        WHERE state = 'NSW' 
                        GROUP BY locality) dupes
            ON dupes.locality = postcodes.locality
            WHERE state = 'NSW' AND dupes.codes_in_suburb = 1) nsw_postcodes
ON nsw_postcodes.locality = dirty_data.suburb;

【问题讨论】:

  • 如果可以共享表结构会很有帮助。
  • 您的查询似乎有问题;特别是,您有一个在任何 FROM 或 JOIN 子句中都没有提及的表 (DBP_POSTCODE)。或者 DBP_POSTCODE 是一个包。还是……???
  • 抱歉,我数据库中的表名是 dbp_postcode。为了清楚起见,我更改了名称,但显然不完全。

标签: sql oracle


【解决方案1】:

用一些条件子句做一个简单的聚合怎么样?

SELECT locality,
       (CASE WHEN COUNT(*) = 1 THEN MAX(postcode)
        END) as postcode,
       COUNT(*) as codes_in_suburb 
FROM postcodes 
WHERE state = 'NSW' 
GROUP BY locality;

如果该地区只有一个邮政编码,则MAX(postcode) 将返回该邮政编码。否则(0 或大于 1)case 将返回 NULL

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2013-03-05
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多