Таблица самообучения Presto / MySQL

0

У меня есть одна бизнес-таблица, как показано ниже, когда люди покупают товары в Интернете. Я хочу видеть 7-дневную ставку удержания: ежедневно, сколько людей ходят по магазинам в Day0, снова возвращаются в магазин в День 1-Day7.

customer_ID |purchase_date 
1           |2017-01-01       
2           |2017-01-01       
3           |2017-01-01       
2           |2017-01-06       
2           |2017-01-07

Вот мой код Presto:

SELECT
    COUNT(DISTINCT bp1.customer_ID) AS retained_customer,
    bp1.purchase_date
FROM
    business bp1,
    business bp2
WHERE
    bp1.customer_ID = bp2.customer_ID
    AND CAST(bp2.purchase_date AS date) BETWEEN date_add('day', 1, CAST(bp1.purchase_date AS date))
    AND date_add('day', 6, CAST(bp1.purchase_date AS date))
GROUP BY
    2
ORDER BY
    2

Он работает вечно, есть ли у кого есть более эффективный способ решить это?

Теги:
presto

1 ответ

1
Лучший ответ

Не уверен, что Presto имеет отношение к запросу, но вот запрос, который предоставит вам информацию:

SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE IF NOT EXISTS 'business' (
    'id'        INT(11) UNSIGNED        NOT NULL    AUTO_INCREMENT                  COMMENT 'Primary Key',
    'customer_id'       INT(11) UNSIGNED        NULL        DEFAULT 0               COMMENT 'Use for a Foriegn Key or integer value',
    'purchase_date'     TIMESTAMP               NOT NULL    DEFAULT '2017-07-07'    COMMENT '0 or 1 flag',
    PRIMARY KEY ('id')
) 
    ENGINE=MyISAM 
    AUTO_INCREMENT=1 
    DEFAULT CHARSET=utf8 
    COLLATE=utf8_unicode_ci
    COMMENT '';

INSERT INTO 'business'
('customer_id','purchase_date')
VALUES
(1,'2017-01-01'),
(2,'2017-01-01'),
(3,'2017-01-04'),
(2,'2017-01-06'),
(2,'2017-01-07'),
(3,'2017-01-05'),
(3,'2017-01-06');

Запрос 1:

SELECT
    Count(DISTINCT b.customer_id) as 'NumRetained',
    CAST(a.purchase_date as DATE) as 'Purchase_Date',
    MIN(b.purchase_date) as 'first_purchase',
    MAX(b.purchase_date) as 'last_purchase'
FROM (SELECT 
        d.customer_id, MIN(d.purchase_date) as 'purchase_date'
      FROM business d
      GROUP BY d.customer_id
      ) a
LEFT JOIN business b
ON a.customer_id = b.customer_id
    AND CAST(b.purchase_date as DATE) 
      BETWEEN DATE_ADD(CAST(a.purchase_date AS DATE),INTERVAL 1 DAY) AND 
        DATE_ADD(CAST(a.purchase_date AS DATE),INTERVAL 6 DAY)
GROUP BY a.purchase_date
ORDER BY a.purchase_date

Результаты:

| NumRetained | Purchase_Date |       first_purchase |        last_purchase |
|-------------|---------------|----------------------|----------------------|
|           1 |    2017-01-01 | 2017-01-06T00:00:00Z | 2017-01-07T00:00:00Z |
|           1 |    2017-01-04 | 2017-01-05T00:00:00Z | 2017-01-06T00:00:00Z |
  • 0
    Вы можете недооценивать удержанного клиента, например, {'1': 2017-01-01, 2017-02-03, 2017-02-04} клиент 1 не возвращался в течение 7 дней с 2017-01-01. Но он / она вернется в течение 7 дней с 2017-02-03. Я просто поставил purchase_date вместо min (d.purchase_date), и это работает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню