如何对唯一查询进行复杂计数

Posted

技术标签:

【中文标题】如何对唯一查询进行复杂计数【英文标题】:How to make a complex count of unique queries 【发布时间】:2020-10-23 14:44:50 【问题描述】:

我正在尝试从 mysql / SQL 数据库中获取特定类型的计数。该表有一列记录是 ID,第二列是另一个参考 ID。一些参考 ID 是整数,一些在其中包含文本。类似这样:

ID  | RefID
123 | 1234567
123 | 1234568
123 | 1234569
123 | ABC/US12/12345
123 | ABC/AA12/12345
123 | ABC/BB12/12345

如果数字是整数,它代表美国。 对于文本 ID,“ABC”部分始终相同,但“AA”和“BB”代表国家代码。有时是“美国”,例如“ABC/US12/12345”。

对于每个 ID,我想要一个唯一国家/地区的计数,以用于它们各自的参考 ID。我想这将使用DISTINCT RefID,看起来像这样:

SELECT ID, count(DISTINCT RefID)
FROM TABLE
GROUP BY ID;

除了简单的 count(DISTINCT RefID) 之外,我希望 DISTINCT 与任何整数 RefID 或 RefID 相关,SUBSTRING(RefID, 5, 2) = "US",否则 DISTINCT 应该是 DISTINCT(SUBSTRING(RefID, 5, 2)) 的 RefID。所以上面数据的计数是3

谁能告诉我这种类型的函数被称为什么或如何完成这个?

【问题讨论】:

DISTINCT 不是一个函数,它是一个 set quantifer。删除那些额外的括号以使代码更清晰,即简单地count(DISTINCT RefID) 好的,很高兴知道这一点。我已经澄清了示例代码。 【参考方案1】:

你似乎想要这样的东西:

SELECT ID,
       COUNT(DISTINCT CASE WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
                           WHEN RefID LIKE '%/US%' THEN 'US'
                           ELSE RefID
                      END)
FROM CONTINUITYCHILD_P
GROUP BY ID;

如果您需要从其他RefIDs 中提取国家/地区,您可能需要额外的逻辑。

【讨论】:

【参考方案2】:

第一个答案接近正确。 实际上,要求是将所有整数 RefID 更改为“US”,然后从所有其他 RefID 中提取国家代码。

这是正确的方法:

SELECT 
ID, 
COUNT(DISTINCT 
    CASE 
    WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
    ELSE SUBSTRING(RefID, 5, 2)
    END
) CountryCount
FROM TABLE
GROUP BY ID
ORDER BY CountryCount DESC;

【讨论】:

以上是关于如何对唯一查询进行复杂计数的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 2.0 如何对每个唯一项目 id 的计数求和

SQL:将时间戳与仅时间参数相匹配,以对多天的唯一时间进行分组和计数

需要帮助编写查询以获取总计数和唯一计数

在excel中获得两个条件的唯一计数

获取bash中列中唯一值的计数

用于获取不同日期以及唯一计数最大值的大查询