在该时间段之前没有一行的情况下,COUNT个数字是不同的

时间:2019-10-01 18:04:47

标签: mysql sql

我有一种有趣的情况,我会尽力解释。

我有一个名为appointments的表,该表中包含销售人员可以与潜在客户进行的许多约会。与销售人员之间的约会关系是多对一的,对于潜在客户而言,也是相同的。

当销售人员之前从未与该潜在客户设置约会时,我需要计算一个销售人员与潜在顾客设置了多少约会。

这是我在代码中走了多远(我想看看销售人员昨天设置了多少约会,因此日期不明确):

SELECT COUNT(DISTINCT lead) 
FROM appointments 
WHERE status = 3 
  and DATE(appointment_created_at) = CURDATE() - interval 1 day 
  AND creator = 'xxx';

({{1}列代表个人销售人员,creator列代表个人潜在客户)

此SQL查询的问题在于,如果销售人员正在与他们设置了约会的潜在客户进行重置的约会,则仍将其视为“已设置约会”。

如何计算约会表中的行数,而不计算之前已经设置的销售线索?

3 个答案:

答案 0 :(得分:1)

如果您希望获得“首次”约会的数量,则可以使用row_number()或相关子查询:

SELECT COUNT(*)
FROM appointments a
WHERE a.status = 3 AND
      a.appointment_created_at >= CURDATE() - interval 1 day AND
      a.appointment_created_at < CURDATE()  AND
      a.creator = 'xxx' AND
      a.appointment_created_at = (SELECT MIN(a2.appointment_created_at)
                                  FROM appointments a2
                                  WHERE a2.creator = a.creator AND
                                        a2.lead = a.lead
                                 );

请注意,我更改了日期比较,因此可以将索引用于WHERE子句。如果您关心性能,则需要在以下位置建立索引:

  • appointments(creator, status, appointment_created_at, lead)
  • appointments(creator, lead, appointment_created_at)

答案 1 :(得分:1)

您可以利用NOT EXISTS()来检查约会是否已经存在。

SELECT COUNT(DISTINCT a1.lead) 
FROM appointments a1
WHERE a1.status = 3 
  and a1.appointment_created_at >= CURRENT_DATE() - INTERVAL 1 DAY
  AND a1.appointment_created_at < CURRENT_DATE()
  AND a1.creator = 'xxx' 
  AND NOT EXISTS (SELECT 1 
                  FROM appointments a2 
                  WHERE a2.creator = 'xxx' 
                        AND a2.lead = a1.lead 
                        AND a2.appointment_created_at < a1.appointment_created_at)

为了获得良好的性能,对于NOT EXISTS()部分中的Correlated子查询,可以使用以下组合索引:(creator, lead, appointment_created_at)

并且,对于主选择查询,您可以添加以下复合索引:(creator, status, appointment_created_at)

答案 2 :(得分:0)

如果销售人员可以重新安排约会,那么您至少需要一个附加字段来存储原始约会日期。还有其他更复杂的解决方案,但这可能是最简单的方法。