mysql中基于不同id的sql时差查找

cwdobuhd  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(305)

我想找出最晚和第二晚之间的日差 order_id 对于每个用户。
预期输出为:

user_id | order_diff
   1    |     1
   3    |     7
   8    |     1
``` `order_diff` 表示两个不同的 `order_id` . 如果没有两个不同的 `order_id` (与用户id 9的情况一样),不返回结果。
在这种情况下 `order_diff` 为了
user_id `1` 是1,因为他2之间的日差不同 `order_id` 是1。但是,没有 `order_diff` 为了 `user_id` 因为他没有2个不同的“订单号”。
这是数据集:

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` 可能不是 `min(order_time)` 
7xzttuei

7xzttuei1#

以下是解决方案:

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

下面是一个测试它的链接。

tcomlyy6

tcomlyy62#

以下方法可行:
架构(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          |

db fiddle视图
细节:
我们确定最大值 order_time 为了一个 user_id 在子选择查询(派生表)中。我们可以把它化名为 latest_order_time .
我们 Join 此结果设置为 orders table。这将帮助我们只考虑最大值为的行 order_time 为了一个 user_id .
现在,我们使用相关子查询来确定最大 order_time 相同用户的值,超出 order_id 值。我们可以把它化名为 second_latest_order_time .
最后,再次将其用作派生表,并删除 second_latest_order_timenull ,并计算 datediff() 剩下的。
决赛 Group By 是必需的,因为您的数据有多个条目

s1ag04yj

s1ag04yj3#

根据你的小提琴:

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

相关问题