如何用SQL按EMP_ID分组为Employee表添加配送状态列
SQL实现Employee表状态字段查询方案
核心实现逻辑
使用窗口函数按Emp_ID分组统计,无需额外适配新增员工ID,天然支持后续扩展。
兼容主流数据库的查询语句
SELECT Emp_ID, DELIVERY_TIME, Delivery_number, CASE WHEN DELIVERY_TIME > '2021-08-08' THEN 'IN FUTURE' WHEN rn = 1 THEN 'DELIVERING' ELSE 'DELIVERED' END AS Status FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Emp_ID ORDER BY CASE WHEN DELIVERY_TIME < '2021-08-08' THEN DELIVERY_TIME END DESC ) AS rn FROM Employee ) t
逻辑说明
- 窗口函数
PARTITION BY Emp_ID会自动按员工ID分组统计,新增员工无需修改查询语句即可适配。 - 内层子查询排序逻辑:仅对小于当前日期的记录按
DELIVERY_TIME倒序排列,每个员工最新的历史配送记录排序值为1。 - 状态判断优先级:优先判断配送时间晚于当前日期的记录标记为
IN FUTURE;剩余小于当前日期的记录中,排序值为1的标记为DELIVERING,其余历史记录标记为DELIVERED。
动态日期适配
如果需要使用实时当前日期而非固定2021年8月8日,将语句中所有'2021-08-08'替换为对应数据库的当前日期函数即可:
- MySQL/PostgreSQL:
CURRENT_DATE - Oracle:
TRUNC(SYSDATE) - SQL Server:
CAST(GETDATE() AS DATE)
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

