根据MySQL中的不同ID查找时差

时间:2018-11-04 20:33:11

标签: mysql sql time

我想找到每个用户的最新order_id和第二最新user_id | order_diff 1 | 1 3 | 7 8 | 1 之间的日期差异。

预期输出为:

order_diff

order_id表示2个不同的order_id之间的天数差异。如果没有两个不同的order_diff(如用户ID 9),则不返回结果。

在这种情况下,user_id 1的{​​{1}}为1,因为他的两个不同order_id之间的天差为1。但是,没有{{1 }}设为order_diff 9,因为他没有2个不同的“ order_id”。

这是数据集:

user_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可能不是order_time

3 个答案:

答案 0 :(得分:1)

可以进行以下操作:

模式(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          |

View on DB Fiddle


详细信息:

  • 我们在子选择查询(Derived Table)中确定order_time的最大值user_id。我们可以将其别名为latest_order_time
  • 我们将此结果集Join orders表中。这将有助于我们仅考虑将order_time的最大值为user_id的行。
  • 现在,在其余order_time个值中,我们使用Correlated Subquery确定同一用户的最大order_id值。我们可以将其别名为second_latest_order_time
  • 最后,再次将此表用作派生表,并删除second_latest_order_timenull的所有情况,并为其余情况计算datediff()
  • 需要最后一个Group By,因为您的数据中有多个
  • 条目

答案 1 :(得分:1)

基于您的fiddle

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

答案 2 :(得分:0)

这是解决方案:

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

这里是link进行测试。