【发布时间】:2018-10-17 19:35:40
【问题描述】:
我有一个如下所示的“订单”表:
+---------------+--------------+------------+
| customer_name | order_number | date |
+---------------+--------------+------------+
| jack | 1 | 2018-01-01 |
| jack | 2 | 2018-01-06 |
| jack | 3 | 2018-01-19 |
| jack | 4 | 2018-01-06 |
| jack | 5 | 2018-02-27 |
| jack | 6 | 2018-02-02 |
+---------------+--------------+------------+
现在,我想要一个表格,以显示连续日期的天数差异。像这样:
+------------+------------+------+
| date | next_date | diff |
+------------+------------+------+
| 2018-01-01 | 2018-01-06 | 5 |
| 2018-01-06 | 2018-01-06 | 0 |
| 2018-01-06 | 2018-01-19 | 13 |
| 2018-01-19 | 2018-02-02 | 14 |
| 2018-02-02 | 2018-02-27 | 25 |
+------------+------------+------+
我使用的查询是这样的:
SELECT orders.date, MIN(table1.date) FROM orders
LEFT JOIN orders table1
on orders.customer_name = table1.customer_name
AND table1.date >= orders.date
AND table1.order_number != orders.order_number
WHERE orders.customer_name = 'jack'
GROUP BY orders.order_number, orders.date
ORDER BY orders.date;
这是输出:
+------------+------------+
| date | next_date |
+------------+------------+
| 2018-01-01 | 2018-01-06 |
| 2018-01-06 | 2018-01-06 |
| 2018-01-06 | 2018-01-06 |
| 2018-01-19 | 2018-02-02 |
| 2018-02-02 | 2018-02-27 |
| 2018-02-27 | NULL |
+------------+------------+
如您所见,存在一些问题。
- 有两行
date和next_date都是2018-01-06。 - 没有
next_date为2018-01-19的行` - 最后一行的
next_date的值为NULL - 如何获取日期的天数差异?
我知道这是因为我已按 order_number 和 >= 分组
但我不知道如何解决这个问题。我觉得有一个明显的简单解决方案正在逃避我。有什么帮助吗?
如果 SQL Fiddle 不起作用:
CREATE TABLE orders
(`customer_name` varchar(4), `order_number` int, `date` varchar(10))
;
INSERT INTO orders
(`customer_name`, `order_number`, `date`)
VALUES
('jack', 1, '2018-01-01'),
('jack', 2, '2018-01-06'),
('jack', 3, '2018-01-19'),
('jack', 4, '2018-01-06'),
('jack', 5, '2018-02-27'),
('jack', 6, '2018-02-02')
;
【问题讨论】:
-
如果没有下单数据;最后一行下一个日期只能为空;除非您希望该日期值与日期列相同
-
是 2018-01-06 行,0 diff 有效结果吗?你希望看到吗?
-
@rs.是的,我确实希望看到它。
-
@krthkskmr,如果我们有另一个 2018-01-06 的 order_number 为 7 会发生什么,你希望两行 0 差异?
-
@rs。确切地!基本上,如果已经为该订单计算了日期差异,则不要计算日期差异。