Как рассчитать «Среднее время между первым посещением и покупкой на item_id» - PullRequest
1 голос
/ 21 сентября 2019

У меня есть две таблицы: event и trans.

CREATE TABLE `event` (
  `event_name` varchar(40) DEFAULT NULL,
  `user_id` varchar(40) DEFAULT NULL,
  `time` timestamp
);

CREATE TABLE `trans` (
  `item_id` varchar(40) DEFAULT NULL,
  `quantity` int(11) DEFAULT NULL,
  `price` decimal(10,0) DEFAULT NULL,
  `user_id` varchar(40) DEFAULT NULL,
  `time` timestamp
)

Допустимые значения для таблицы событий (несколько посещений пользователя):

|visit |a1 |2016-09-14 22:48:14 |
|visit |a2 |2016-09-14 22:48:28 |
|visit |a3 |2016-09-14 22:48:45 |
|visit |a1 |2016-09-15 15:10:39 |
|visit |a2 |2016-09-15 15:11:08 |
|visit |a1 |2016-09-15 15:12:34 |

и для таблицы транс

|i1 |1 |100 |a1 |2016-09-15 15:12:22 |
|i2 |2 |100 |a2 |2016-09-15 15:13:17 |
|j1 |1 |140 |a1 |2016-09-15 16:12:22 |
|j4 |3 |150 |a3 |2016-09-15 16:13:17 | 

Я написал запрос, чтобы определить среднее время между первым посещением и первой покупкой среди пользователей.

SELECT AVG(timestampdiff(second, e.mintime, t.mintime))
FROM (SELECT user_id, min(time) AS mintime
      FROM event e
      GROUP BY user_id
     ) e JOIN
     (SELECT user_id, min(time) AS mintime
      FROM trans t
      GROUP BY user_id
     ) t
     ON e.user_id = t.user_id;

Но теперь я хочу найти среднее время между первым посещением и покупкой для item_id.

Для приведенных выше данных, как я могу написать запрос для поиска ...

Среднее время между первым посещением и покупкой для item_id.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

как насчет этого?Это самая близкая вещь, которую я могу придумать.

SELECT *, timestampdiff(second, e.`time`, t.`time`) as difference
FROM  `event` e
left join trans as t ON t.user_id = e.user_id  -- same use
    AND YEAR(e.`time`) =  YEAR(t.`time`) -- same year
    AND MONTH(e.`time`) =  MONTH(t.`time`) -- same month
    AND DAY(e.`time`) =  DAY(t.`time`) -- same day
    AND  t.`time` between e.`time` AND ADDTIME( e.`time`,"0:10:00") -- ten minutes RANGE
order by  e.user_id, YEAR(e.`time`), MONTH(e.`time`), DAY(e.`time`), e.`time`
;

Я не уверен, что это РОДИТЕЛЬСКИЙ СТОЛ.Попробуйте переключить объявление левой таблицы соединений и повторно изменить условие RANGE.

0 голосов
/ 21 сентября 2019

Если я правильно понимаю, вам нужно среднее значение от первого посещения до покупки для каждого элемента на пользователя, который приобретает элемент .

Если это так, то вы можете просто добавить item_id ко второму подзапросу и затем использовать его для агрегирования во внешнем запросе:

SELECT t.item_id, AVG(timestampdiff(second, e.mintime, t.mintime))
FROM (SELECT user_id, min(time) AS mintime
      FROM event e
      GROUP BY user_id
     ) e JOIN
     (SELECT user_id, item_id, min(time) AS mintime
      FROM trans t
      GROUP BY user_id, item_id
     ) t
     ON e.user_id = t.user_id
GROUP BY t.item_id;
...