每个月内选择 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 < "2015-01-01" AND date > "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的主要内容,如果未能解决你的问题,请参考以下文章