SQL, как рассчитать количество событий, которые произошли за период времени? - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно знать, как телефонный звонок влияет на наших клиентов

поэтому после того, как я позвоню клиенту, мне нужно выяснить, вошли ли они в свою учетную запись в течение 1 дня после или в течение 7 дней после или в течение 14 дней после вызова.

Как мне вообще использовать datediff в этом случае?

enter image description here

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Предполагая, что; - таблица называется logininfo и - что call_time и logged_in_time хранятся в соответствии с ГГГГ-ММ-ДД ЧЧ: ММ (или одним из поддерживаемых форматов в соответствии с функциями даты и времени )

Тогда я считаю, что следующее будет делать то, что вы хотите: -

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 дней. после звонка. , как в течение 7 дней после, будет включать количество звонков, сделанных в течение 1 дня после, и так далее. Если это не так, это просто вопрос правильного изменения 3 последних предложений WHERE.

Предполагается, что таблица заполнена как: -

enter image description here

Вышеуказанное приведет к: -

enter image description here

Ниже приведен полный использованный сценарий тестирования: -

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

Примечание здесь не используется дата, а разница в дате определяется в запросе.

0 голосов
/ 13 ноября 2018

Вы можете использовать условные суммы в методах агрегирования 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
...