【问题标题】:OVER PARTITION BY in MYSQL 5.1? (Without Window Functions)在 MYSQL 5.1 中过度分区? (无窗函数)
【发布时间】: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


【解决方案1】:

看来你需要这个:

SELECT emp_id, 
       delivery_time, 
       t1.delivery_number,
       CASE WHEN delivery_time > @today
            THEN 'IN FUTURE'
            WHEN t3.emp_id IS NOT NULL
            THEN 'DELIVERING'
            ELSE 'DELIVERED' 
            END status
FROM employee t1
LEFT JOIN ( SELECT emp_id, MAX(delivery_time) delivery_time
            FROM employee t2
            WHERE delivery_time < @today
            GROUP BY emp_id ) t3 USING (emp_id, delivery_time)
ORDER BY 1,2;

fiddle


也请参阅编辑。 ——哈迪克·索马尼

SELECT emp_id, 
       delivery_time, 
       t1.delivery_number,
       CASE WHEN delivery_time IS NULL
            THEN 'PENDING'
            WHEN delivery_time > @today
            THEN 'IN FUTURE'
            WHEN t3.emp_id IS NOT NULL
            THEN 'DELIVERING'
            ELSE 'DELIVERED' 
            END status
FROM employee t1
LEFT JOIN ( SELECT emp_id, MAX(delivery_time) delivery_time
            FROM employee t2
            WHERE delivery_time < @today
            GROUP BY emp_id ) t3 USING (emp_id, delivery_time)
ORDER BY 1,2;

fiddle

【讨论】:

  • 嗨,对不起,请参阅编辑。
  • @HardikSomani 已更新。你可以自己修。
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多