【问题标题】:SQL how to count the number of events that happened over a time period?SQL如何计算一段时间内发生的事件数?
【发布时间】:2019-04-15 19:39:17
【问题描述】:

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

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

在这种情况下,我什至如何使用 datediff?

【问题讨论】:

  • 使用该数据显示您的表定义、示例行和预期输出。
  • 这是数据的预期输出,我的列是customer_id、call_time和logged_in_time。
  • 在不知道我们必须处理什么的情况下无法提供帮助。

标签: sql sqlite sum window-functions datediff


【解决方案1】:

假设; - 表名为 logininfo 并且 - call_time 和 logged_in_time 是根据 YYYY-MM-DD HH:MM 存储的(或根据Date And Time Functions 支持的格式之一)

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

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 子句。
  • 您的预期结果似乎不符合,所以在我给客户打电话后,我需要查看他们是否在 1 天后、7 天后或 14 天内登录到他们的帐户after the call. as within 7 days after 将包括 1 天内拨打的电话次数,依此类推。如果不是这种情况,只需适当更改最后 3 个 WHERE 子句即可。

假设一个表格填充为:-

以上将导致:-

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

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'
;

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

【讨论】:

    【解决方案2】:

    您可以在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多