SQL 如何统计一段时间内发生的事件数?

SQL how to count the number of events that happened over a time period?

我需要知道 phone 电话对我们的客户有何影响

因此,在我给客户打了一个 phone 电话后,我需要查看他们是否在电话后 1 天内、7 天内或 14 天内登录了他们的帐户。

在这种情况下我该如何使用 datediff?

您可以在 SQL 聚合方法中使用条件求和

SELECT SUM(CASE WHEN time > 1 AND time <= 7 THEN 1 ELSE 0 END)   AS LoggedInAfter1day,
       SUM(CASE WHEN time > 7 AND time <= 14 THEN 1 ELSE 0 END ) AS LoggedInAfter7day,
       SUM(CASE WHEN time > 14 THEN 1 ELSE 0 END )               AS LoggedInAfter14day
FROM ( SELECT (logged_in_time - call_time) As time FROM customers ) AS c

假设; - table 被命名为 logininfo 并且 - call_time 和 logged_in_time 根据 YYYY-MM-DD HH:MM 存储(或根据 [=12= 支持的格式之一) ])

那么我相信下面会做你想要的:-

WITH 
        CTE1 AS (
            SELECT customer_id, strftime('%Y%m%d',logged_in_time) - strftime('%Y%m%d',call_time) AS daysafter  
            FROM logininfo 
            WHERE (strftime('%Y%m%d',logged_in_time) - strftime('%Y%m%d',call_time)) > 0 -- ignore login the same day
                AND customer_id = 1 -- must be for this customer
                AND date(call_time) = date('2018-01-01') -- must be in relation to this call (if wanted)
        )

SELECT (SELECT customer_id FROM CTE1 ORDER BY customer_id),
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 1) AS 'logged in 1 day after',
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 7) AS 'logged in 7 days after',
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 14) AS 'logged in 14 days after'
;
  • 您可以将适当的 customer_id 和 call_time 应用于 where 子句。
  • 您的预期结果似乎不符合 所以在我给客户打了 phone 电话后,我需要看看他们是否在 1 天内登录了他们的帐户,或者通话后 7 天内或通话后 14 天内。 如通话后 7 天内,将包括通话后 1 天内拨打的电话数,依此类推。如果不是这种情况,只需适当更改最后 3 个 WHERE 子句即可。

假设 table 填充为:-[​​=15=]

以上将导致:-

以下是使用的完整测试脚本:-

DROP TABLE IF EXISTS logininfo;
CREATE TABLE IF NOT EXISTS logininfo (customer_id INTEGER, call_time TEXT, logged_in_time TEXT);
INSERT INTO logininfo VALUES
    (1,'2018-01-01 11:30','2018-01-02 10:00'), 
    (1,'2018-01-01 11:30','2018-01-03 10:00'),
    (1,'2018-01-01 11:30','2018-01-04 10:00'),
    (1,'2018-01-01 11:30','2018-01-05 10:00'),
    (1,'2018-01-01 11:30','2018-01-06 10:00'),
    (1,'2018-01-01 11:30','2018-01-07 10:00'),
    (1,'2018-01-01 11:30','2018-01-08 10:00'),
    (1,'2018-01-01 11:30','2018-01-15 10:00'),
    (1,'2018-01-01 11:30','2018-01-16 10:00'),
    (1,'2018-01-01 11:30','2018-01-17 10:00'),

    (1,'2018-02-01 11:30','2018-02-14 10:00'),
    (1,'2018-02-01 11:30','2018-02-15 10:00'),
    (1,'2018-02-01 11:30','2018-02-16 10:00'),
    (1,'2018-02-01 11:30','2018-02-17 10:00'),
    (1,'2018-02-01 11:30','2018-02-18 10:00'),
    (1,'2018-02-01 11:30','2018-02-19 10:00'),

    (2,'2018-01-01 11:30','2018-01-02 10:00'),
    (2,'2018-01-01 11:30','2018-01-03 10:00'),
    (2,'2018-01-01 11:30','2018-01-04 10:00'),
    (2,'2018-01-01 11:30','2018-01-05 10:00'),
    (2,'2018-01-01 11:30','2018-01-15 10:00'),
    (2,'2018-01-01 11:30','2018-01-16 10:00'),
    (2,'2018-01-01 11:30','2018-01-17 10:00')
    ;

SELECT * FROM logininfo;

WITH 
        CTE1 AS (
            SELECT customer_id, strftime('%Y%m%d',logged_in_time) - strftime('%Y%m%d',call_time) AS daysafter  
            FROM logininfo 
            WHERE (strftime('%Y%m%d',logged_in_time) - strftime('%Y%m%d',call_time)) > 0 -- ignore login the same day
                AND customer_id = 1 -- must be for this customer
                AND date(call_time) = date('2018-01-01') -- must be in relation to this call (if wanted)
        )

SELECT (SELECT customer_id FROM CTE1 ORDER BY customer_id),
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 1) AS 'logged in 1 day after',
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 7) AS 'logged in 7 days after',
    (SELECT count() FROM CTE1 WHERE daysafter > 0 AND daysafter <= 14) AS 'logged in 14 days after'
;

注意这不使用日期差异,而是在查询中确定日期差异。