【发布时间】:2021-12-22 02:44:16
【问题描述】:
我一直在做 SQL,但我陷入了困境。 例如,假设我们有一个 Table Employee,其中包含 Emp_ID(varchar)、DELIVERY_TIME(date)、Delivery_number(Varchar) 列
| EMP_ID | DELIVERY_TIME | DELIVERY_NUMBER |
|---|---|---|
| E01 | 21-08-2021 | 4 |
| E01 | null | 1 |
| E01 | 21-08-2022 | 5 |
| E01 | 21-05-2021 | 2 |
| E01 | 07-08-2021 | 3 |
| E02 | 21-08-2021 | 4 |
| E02 | 21-08-2023 | 5 |
| E02 | 21-08-2020 | 1 |
| E02 | 21-06-2021 | 2 |
| E02 | 06-08-2021 | 3 |
现在我想通过一些查询在其中添加一个状态列来操作表,例如:
| EMP_ID | DELIVERY_TIME | STATUS |
|---|---|---|
| E01 | 21-08-2021 | IN FUTURE |
| E01 | null | PENDING |
| E01 | 21-08-2022 | IN FUTURE |
| E01 | 21-05-2021 | DELIVERED |
| E01 | 07-08-2021 | DELIVERING |
| E02 | 26-08-2021 | IN FUTURE |
| E02 | 21-08-2023 | IN FUTURE |
| E02 | 21-08-2020 | DELIVERED |
| E02 | 21-06-2021 | DELIVERED |
| E02 | 06-08-2021 | DELIVERING |
基本上,如果今天是 2021 年 9 月 8 日 (08-08-2021) 那么,
- 对于日期 > , IN - FUTURE
- 对于日期
- for max(date)
- 对于为空的日期,待处理
- 从所有小于当前日期的日期中,应将其中的最大值(最新)标记为正在交付。 (只有一个会在那里)。例如,如果今天的日期是 2021 年 8 月 8 日,并且在数据库中我们有 07-08-2021、06-08-2021 和 05-08-2021 等日期,则 07-08-2021 应标记为交付,但其余两个应标记为已送达。
但这是针对每个员工 ID 分别完成的。 此外,如果这可以仅使用查询而不使用脚本来完成,那将更可取。我们还可以添加新的 EMP_ID。
请指导。 谢谢。
我尝试过使用 Over Partition by,但它不起作用。
select
emp_id,
delivery_time,
case
when max_delivery_time_when_not_in_future = delivery_time
then 'delivering' else status end as final_status
from
(select
*,
max(case when status not in ('In future') then delivery_time else null end)
over(partition by emp_id order by delivery_time desc) as max_delivery_time_when_not_in_future (
select
*,
case when when curdate() < delivery_time then 'In future'
when curdate() > delivery_time then 'delivered'
else 'not categorized'
END as status
from [table name]
) date_1) max_date
编辑:Create table Employee(Emp_ID varchar(48), DELIVERY_TIME date, Delivery_number varchar(48))
INSERT INTO EMPLOYEE VALUES('E01' , '2021-08-21' , '4');
INSERT INTO EMPLOYEE VALUES('E01' , '2019-08-21' , '1');
INSERT INTO EMPLOYEE VALUES('E01' , '2022-08-21' , '5');
INSERT INTO EMPLOYEE VALUES('E01' , '2021-05-21' , '2');
INSERT INTO EMPLOYEE VALUES('E01' , '2021-08-07' , '3');
INSERT INTO EMPLOYEE VALUES('E02' , '2021-08-21' , '4');
INSERT INTO EMPLOYEE VALUES('E02' , '2023-08-21' , '5');
INSERT INTO EMPLOYEE VALUES('E02' , '2020-08-21' , '1');
INSERT INTO EMPLOYEE VALUES('E02' , '2021-06-21' , '2');
INSERT INTO EMPLOYEE VALUES('E02' , '2021-08-06' , '3');
【问题讨论】:
-
获取窗口函数需要 MySQL 8 版本。
-
可以,但是如果没有Window功能也可以,请指导。
-
创建表Employee( Emp_ID(varchar), DELIVERY_TIME(date), Delivery_number(Varchar) ), 插入EMPLOYEE values(, , ,)
-
编辑了帖子。
-
您的代码不正确。
'21-08-2021'不是有效的 DATE 文字。
标签: mysql sql window-functions mysql-5.1