我有一种有趣的情况,我会尽力解释。
我有一个名为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查询的问题在于,如果销售人员正在与他们设置了约会的潜在客户进行重置的约会,则仍将其视为“已设置约会”。
如何计算约会表中的行数,而不计算之前已经设置的销售线索?
答案 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)
如果销售人员可以重新安排约会,那么您至少需要一个附加字段来存储原始约会日期。还有其他更复杂的解决方案,但这可能是最简单的方法。