每个月内选择 DISTINCT 计数条​​目。 MYSQL

Posted

技术标签:

【中文标题】每个月内选择 DISTINCT 计数条​​目。 MYSQL【英文标题】:SELECT DISTINCT count entries within each month. MYSQL 【发布时间】:2015-12-08 17:05:01 【问题描述】:

您好,我有一个数据库,其中一列包含电子邮件地址,第二列包含类别,第三列包含日期。

我想要做的是计算多个日期范围之间“A”类中唯一电子邮件地址的数量。所以我有这个:

SELECT COUNT(DISTINCT email) as counter 
FROM table 
WHERE category = "A" AND date < "2015-12" AND date > "2015-11";

然后我会单独查询第二个日期范围。

现在这是我的问题:

如果一个电子邮件地址出现在第一个月和第二个月,它将在两个月内继续计数,因为它在我查询的范围内是唯一的。

我如何创建一个查询来计算一年的唯一电子邮件地址,然后计算一个月内的不同条目而不包括重复项?

谢谢!

【问题讨论】:

再次混淆“假设一年的唯一电子邮件地址” - 一年中不同月份的相同电子邮件每个月算作一个还是分别算作一个?如果你想得到正确的结果,你必须非常详细和明确地解释你需要什么。这是编程的重要组成部分。 【参考方案1】:

如果您想要自定义日期,可以将值设置为 vars

$custom_date_begin = "2015-01-10";
$custom_date_end  = "2015-02-10";

那么对于 vars 和月份组,你可以使用类似这样的东西

 "SELECT COUNT(DISTINCT email) as counter 
 FROM table 
 WHERE category = 'A' 
 AND date >= '$custom_begin_date' AND date <='$custom_end_date'
 group by MONTH (date);"

【讨论】:

查询总是返回空结果,因为没有日期可以满足这个:date &lt; "2015-01-01" AND date &gt; "2015-12-31" 感谢 scaisEdge!如果我想要自定义日期范围...比如 2015-01-10 > 2015-02-10,我该怎么做? 我已经用 vars 更新了自定义日期的答案。如果答案正确,请标记为已接受和/或评价为有用【参考方案2】:

提供的信息不足以编写足够的查询。所以我会尝试猜测细节。

假设我们需要计算每个月和每个类别的唯一电子邮件数量。

查询可能如下所示:

SELECT dt, category, COUNT(*) AS cnt 
FROM (
    SELECT LEFT(`date`,7) AS dt, category, email
    FROM table 
    GROUP BY LEFT(`date`,7), category, email
) x
GROUP BY dt, category

如果您有可变的日期范围,那么您最好每天分组,然后通过脚本为每个日期范围计算电子邮件。

【讨论】:

以上是关于每个月内选择 DISTINCT 计数条​​目。 MYSQL的主要内容,如果未能解决你的问题,请参考以下文章

过去 X 个月内的 PostgreSQL 累积计数

Mysql 选择查询计数和 Distinct 无法正常工作

Oracle distinct listagg 与计数

LINQ 以 Lambda 形式选择不同计数

最短路计数

P1144 最短路计数