Нахождение разницы во времени на основе различных идентификаторов в MySQL - PullRequest
0 голосов
/ 04 ноября 2018

Я хотел бы найти разницу в днях между самым последним и вторым последним отдельным order_id для каждого пользователя.

Предполагаемый результат будет:

user_id | order_diff
   1    |     1
   3    |     7
   8    |     1

order_diff представляет разницу в днях между 2 различными order_id. В случае, если нет двух разных order_id (как в случае с идентификатором пользователя 9), результат не возвращается.

В этом случае order_diff для user_id 1 равно 1, поскольку разность дней между его 2 различными order_id равна 1. Однако для user_id 9 нет order_diff, поскольку он имеет нет 2 разных `order_id '.

Это набор данных:

user_id order_id    order_time
1       208965785   2016-12-15 17:14:13
1       201765785   2016-12-14 17:19:05
1       203932785   2016-12-13 20:41:30
1       209612785   2016-12-14 20:14:32
1       208112785   2016-12-14 20:27:08
1       205525785   2016-12-14 17:01:26
1       208812785   2016-12-14 20:18:23
1       206432785   2016-12-11 20:32:20
1       206698785   2016-12-14 10:50:15
2       209524795   2016-11-26 18:06:21
3       206529925   2016-10-01 10:43:57
3       203729925   2016-10-08 10:43:11
4       204876145   2016-09-24 10:23:49
5       203363157   2016-07-13 23:56:43
6       207784875   2017-01-04 12:21:21
7       206437177   2016-06-25 02:40:33
8       202819645   2016-09-09 11:47:27
8       202819645   2016-09-09 11:47:27
8       202819646   2016-09-08 11:47:27
9       205127187   2016-06-05 22:21:18
9       205127187   2016-06-05 22:21:18
11      207874877   2016-06-17 16:49:44
12      204927595   2016-11-28 23:05:40

Это код, который я сейчас использую:

SELECT e1.user_id,datediff(e1.order_time,e2.time), e1.order_id FROM
sales e1
JOIN
sales e2
ON
e1.user_id=e2.user_id
AND
e1.order_id = (SELECT distinct order_id FROM sales temp1 WHERE temp1.order_id =e1.order_id ORDER BY order_time DESC LIMIT 1)
AND
e2.order_id = (SELECT distinct order_id FROM sales temp2 WHERE temp2.order_id=e2.order_id ORDER BY order_time DESC LIMIT 1 OFFSET 1)

Мой вывод не дает желаемого результата, а также игнорирует случаи, когда order_ids одинаковы.

Редактировать : Я также хотел бы, чтобы запрос был расширен на более крупные наборы данных, где 2-й самый последний order_time может не быть min(order_time)

Ответы [ 3 ]

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

Будет работать следующее:

Схема (MySQL v5.7)

CREATE TABLE orders
    (`user_id` int, `order_id` int, `order_time` datetime)
;

INSERT INTO orders
    (`user_id`, `order_id`, `order_time`)
VALUES
(1,208965785,'2016-12-15 17:14:13'),
(1,201765785,'2016-12-14 17:19:05'),
(1,203932785,'2016-12-13 20:41:30'),
(1,209612785,'2016-12-14 20:14:32'),
(1,208112785,'2016-12-14 20:27:08'),
(1,205525785,'2016-12-14 17:01:26'),
(1,208812785,'2016-12-14 20:18:23'),
(1,206432785,'2016-12-11 20:32:20'),
(1,206698785,'2016-12-14 10:50:15'),
(2,209524795,'2016-11-26 18:06:21'),
(3,206529925,'2016-10-01 10:43:57'),
(3,203729925,'2016-10-08 10:43:11'),
(4,204876145,'2016-09-24 10:23:49'),
(5,203363157,'2016-07-13 23:56:43'),
(6,207784875,'2017-01-04 12:21:21'),
(7,206437177,'2016-06-25 02:40:33'),
(8,202819645,'2016-09-09 11:47:27'),
(8,202819645,'2016-09-09 11:47:27'),
(8,202819646,'2016-09-08 11:47:27'),
(9,205127187,'2016-06-05 22:21:18'),
(9,205127187,'2016-06-05 22:21:18'),
(11,207874877,'2016-06-17 16:49:44'),
(12,204927595,'2016-11-28 23:05:40');

Запрос № 1

SELECT dt2.user_id, 
       MIN(datediff(dt2.latest_order_time, 
                dt2.second_latest_order_time)) AS order_diff 
FROM (
 SELECT o.user_id, 
        o.order_time AS latest_order_time,  
        (SELECT o2.order_time 
         FROM orders AS o2 
         WHERE o2.user_id = o.user_id AND 
               o2.order_id <> o.order_id 
         ORDER BY o2.order_time DESC LIMIT 1) AS  second_latest_order_time 
 FROM orders AS o 
 JOIN (SELECT user_id, MAX(order_time) AS latest_order_time 
       FROM orders 
       GROUP BY user_id) AS dt 
   ON dt.user_id = o.user_id AND 
      dt.latest_order_time = o.order_time 
) AS dt2 
WHERE dt2.second_latest_order_time IS NOT NULL 
GROUP BY dt2.user_id;

| user_id | order_diff |
| ------- | ---------- |
| 1       | 1          |
| 3       | 7          |
| 8       | 1          |

Посмотреть на скрипку БД


подробности:

  • Мы определяем максимум order_time для user_id в запросе дополнительного выбора ( Производная таблица ). Мы можем использовать псевдоним как latest_order_time.
  • Мы Join получаем этот набор результатов для таблицы orders. Это поможет нам в рассмотрении только строки (ей) с максимальным значением order_time для user_id.
  • Теперь мы используем коррелированный подзапрос , чтобы определить максимальное значение order_time для того же пользователя из остальных значений order_id. Мы можем использовать псевдоним как second_latest_order_time.
  • Наконец, снова используйте это как производную таблицу и удалите все случаи, когда second_latest_order_time равно null, и вычислите datediff() для остальных.
  • Требуется окончательный Group By, так как ваши данные содержат несколько записей для
0 голосов
/ 05 ноября 2018

На основе вашей скрипки :

select user_id, 
   datediff(max(order_time), 
            ( -- Scalar Subquery to get the 2nd largest order_time
              select max(order_time)
              from orders as o2
              where o2.user_id = o.user_id              -- same user
                and o2.order_time < max(o.order_time)   -- but not the max time
            )
           ) as diff
from orders as o
group by user_id
having diff is not null -- if there's no 2nd largest time diff will be NULL
0 голосов
/ 05 ноября 2018

Вот решение:

SELECT user_id, 
   DATEDIFF(MAX(order_time), MIN(order_time)) as order_diff
FROM orders
GROUP BY user_id
   HAVING order_diff > 0;

Вот ссылка для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...