sql 对另一列中特定日期之前的调用次数进行计数/求和

标签 sql sql-server count sum conditional-statements

我有显示客户来电的数据。我有客户号码、电话号码(1 个客户可以有多个)、每个语音调用的日期记录以及调用持续时间的列。表看起来如下示例。

CusID |  PhoneNum   |  Date             | Duration
20111    43576233   20.01.2016-14:00     00:10:12
20111    44498228   14.01.2016-15:30     00:05:12
20112    43898983   14.01.2016-15:30     

我想要的是在应答之前计算每个号码的调用尝试次数(持续时间> 0)。这样我就可以估计平均应该调用多少次才能联系到客户或电话号码。它基本上应该计算每个电话号码在 min(Date) 之前的任何列,其中持续时间 >0。

SELECT Phone, Min(Date) FROM XX WHERE Duration IS NOT NULL GROUP BY Phone -- 

我认为这应该给我一个时间限制,直到我应该计算调用次数。我不知道如何完成剩下的工作

编辑-我将添加一个示例

enter image description here

结果应该只计算第 5 行,因为这是第一次联系客户之前的调用。所以结果表应该是这样的:

enter image description here

最佳答案

您的第一步有效:

    SELECT
        CusID
        ,PhoneNum
        ,MIN(Date) AS MinDate
    FROM XX
    WHERE Duration IS NOT NULL
    GROUP BY CusID, PhoneNum

这将为每个 PhoneNum 提供一行,其中包含第一次成功调用的日期。

现在将此连接到原始表,并仅保留具有先前日期的那些行(根据 PhoneNum)。再次按 PhoneNum 分组并计数。连接应该是LEFT JOIN,以使第一次尝试回答的数字的行计数为零。

WITH
CTE
AS
(
    SELECT
        CusID
        ,PhoneNum
        ,MIN(Date) AS MinDate
    FROM XX
    WHERE Duration IS NOT NULL
    GROUP BY CusID, PhoneNum
)
SELECT
    CusID
    ,PhoneNum
    ,COUNT(XX.PhoneNum) AS Count
FROM
    CTE
    LEFT JOIN XX
        ON  XX.PhoneNum = CTE.PhoneNum
        AND XX.Date < CTE.MinDate
GROUP BY CusID, PhoneNum
;

如果某个号码从未被应答,则它根本不会包含在结果集中。

关于sql 对另一列中特定日期之前的调用次数进行计数/求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551595/

相关文章:

php - 获取数组最高值查询mysql,php

mysql - 从表中删除重复项

sql - 如何根据sql查询结果中的顺序枚举一组连续的行

sql-server - 为什么在Insert触发器中使用 "IF @@ROWCOUNT = 0 RETURN"?

sql-server - 在大型数据库中搜索特定 ID?

mysql - 如何为订单及其项目编写自定义 MySQL 选择查询

mysql - 想优化mysql查询

mysql - 根据值更新数据库

mysql - 使用限制SQL后检查查询数量

mysql - 生成数据摘要,MySQL中多列的行数