Mysql SQL帮助:更新日期时,如何按组计数?

Mysql SQL帮助:更新日期时,如何按组计数?,mysql,sql,database,tableau-api,Mysql,Sql,Database,Tableau Api,Percona MySql 5.6,linux x64 我们有一个customers\u history表,跟踪客户随时间的变化。我们想做的是按供应商(lead_source_id)统计特定月份的变化 +--------+-------------+----------------+---------------------+--------+ | id | customer_id | lead_source_id | repurchased_date | Rating | +--

Percona MySql 5.6,linux x64

我们有一个
customers\u history
表,跟踪客户随时间的变化。我们想做的是按供应商(lead_source_id)统计特定月份的变化

+--------+-------------+----------------+---------------------+--------+
| id     | customer_id | lead_source_id |   repurchased_date  | Rating |
+--------+-------------+----------------+---------------------+--------+
| 422923 |      420450 |              4 | 2014-04-14 09:16:48 |   Warm |
| 422924 |      420450 |              4 | 2014-04-14 09:16:48 |   Cold |
| 422956 |      420450 |              4 | 2014-04-14 09:16:49 |    Hot |
| 422933 |      420451 |             37 | 2014-04-14 09:18:41 |    Hot |
| 422938 |      420452 |              1 | 2014-04-10 20:50:30 |    Hot |
| 422984 |      420452 |              1 | 2014-04-12 20:50:30 |    Hot |
| 422940 |      420453 |             47 | 2014-04-14 09:20:27 |    Hot |
+--------+-------------+----------------+---------------------+--------+
鉴于上述示例,我们想要的是这份报告,它报告了供应商的回购情况(lead_source_id)。当回购日期更新时,才符合回购的条件。仅更改评级不起作用

+----------------+-------+
| lead_source_id | count |
+----------------+-------+
|              4 |     2 |
|             37 |     1 |
|              1 |     2 |
|             47 |     1 |
+----------------+-------+
我们最初尝试过:


选择计数(不同(总回购日))
来自客户(历史)
其中年份(总回购日)=2014年
月份(总回购日)=4
并且ch.lead\u source\u id不为空;

但是,当您将where子句更改为
SELECT DISTINCT(ch.created_at))、lead_source_id
时,计数与返回的行数不同

不管怎么说,我们在泡菜罐里想弄明白。非常感谢你的帮助和指点

编辑 废话。我很抱歉,伙计们,谢谢你们迄今为止的答案,但我完全忘记了为什么这个问题如此棘手。这实际上是一个历史记录表,它记录了来自多个列的更改。我编辑了原始问题


请注意,当评级发生变化时,回购日不会发生变化。我们想从计数中排除第422923行,但计数第422924行和第422956行。

我不确定我是否了解您的要求。 你是什么意思

SELECT ch.lead_source_id, count(*)
FROM customers_history ch
WHERE
     Year(ch.created_at) = 2014 AND
     Month(ch.created_at) = 4 AND ch.lead_source_id IS NOT NULL
GROUP BY ch.lead_source_id;

您的查询看起来非常接近。我认为所需要的只是添加一个
groupby
子句

COUNT(DISTINCT foo)
将有效地“折叠”相同的值,因此对于相同日期值的每个:group:,计数只增加1

根据样本数据和所需的结果集,这应该是可行的:

 SELECT ch.lead_source_id
      , COUNT(DISTINCT ch.repurchased_date)
   FROM customers_history ch
  WHERE ch.repurchased_date >= '2014-04-01'
    AND ch.repurchased_date  < '2014-04-01' + INTERVAL 1 MONTH
    AND ch.lead_source_id IS NOT NULL
  GROUP
     BY ch.lead_source_id
更新

如果希望“计数”也由
客户更新到
,请将该列包含在
分组依据中。例如,如果此示例数据:

+--------+-------------+----------------+---------------------+
| id     | customer_id | lead_source_id |   cust_updated_at   |
+--------+-------------+----------------+---------------------+
| 422924 |      420450 |              4 | 2014-04-14 09:16:48 |
| 422956 |      420450 |              4 | 2014-04-14 09:16:48 |
| ?????? |      420450 |              4 | 2014-04-15 22:22:22 |
+--------+-------------+----------------+---------------------+
您要返回:

+----------------+-------+
| lead_source_id | count |
+----------------+-------+
|              4 |     2 |
|              4 |     1 |
+----------------+-------+
然后,将位于
cust\u updated\u列添加到
分组依据
子句中,例如:

SELECT ch.lead_source_id
     , COUNT(1) AS count_
  FROM customers_history ch
 WHERE ch.cust_updated_at >= '2014-04-01' 
   AND ch.cust_updated_at <  '2014-04-01' + INTERVAL 1 MONTH
   AND ch.lead_source_id IS NOT NULL
 GROUP
    BY ch.lead_source_id
     , ch.cust_updated_at
MySQL完全可以从索引上满足查询;解释输出将显示“使用索引”。如果我们不使用ORDERBY子句,MySQL也将避免“使用filesort”操作



提示“分组依据(lead\u sorce\u id)”正确,但如果您按lead\u sorce\u id分组,则还必须按更新的客户分组。注意,两行有相同的客户更新地址,这不就是答案吗?从客户历史记录中选择lead\u sorce\u id,COUNT(lead\u sorce\u id)每个lead\u sorce\u id我现在没有笔记本电脑,但我在某个地方看到了这种问题,解决方法是使用COUNT和GROUP BY,我已经说不出来了,我不太懂sql谢谢你提供的索引扫描信息,我不知道。看到更新后的问题,我们意识到我们遗漏了一些关键问题。@exabrial:我已经看过更新后的问题,这有点棘手。如果我理解您的意思,您希望从计数中排除第422923行,因为日期列没有更改。也就是说,如果相同的
lead\u source\u id
有多行具有相同的日期时间值,则不希望:计数:重复的日期时间行。只需将这组更改一起计算为1个更改。(这解释了原始查询中的
计数(DISTINCT())
)“如果我理解您的意思,您希望从计数中排除第422923行,因为日期列没有更改”是的,这是正确的。@exabrial:Answer updated,new Answer在顶部。你的提问几乎完美无瑕。使用
COUNT(DISTINCT foo)
(与原始查询中的类似),有效地“折叠”重复项,以便each:group:增加计数。只需要添加GROUPBY子句。请注意,
DISTINCT
是一个关键字。这不是一个函数,所以不需要在parens中包装“foo”。潜在客户来源和客户之间没有关联,这只是样本的一个侥幸。。。但这似乎没有什么不同。我会尝试一下,谢谢!
SELECT ch.lead_source_id
     , COUNT(1) AS count_
  FROM customers_history ch
 WHERE ch.cust_updated_at >= '2014-04-01' 
   AND ch.cust_updated_at <  '2014-04-01' + INTERVAL 1 MONTH
   AND ch.lead_source_id IS NOT NULL
 GROUP
    BY ch.lead_source_id
     , ch.cust_updated_at
... ON customer_history (lead_source_id, created_at)