You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Shift分区,根据Sort cart的Dept生成Shift_loc列的SQL实现

问题:为工人动作表新增Shift_loc列

现有一张记录工人动作的表,包含action_ID、action_name、Action_DTTM、Dept、Shift_ID字段。需要新增Shift_loc列,该列的值需根据每个Shift_ID分区内,Action_Name为Sort cart的记录对应的Dept值来确定。

原始表数据

Action_IDAction_NameAction_DTTMDeptShift_ID
1Load cart11/01/2023 14:12:01NULL1
2Sort cart11/01/2023 16:12:23Magenta1
3Distribute11/01/2023 16:17:14M1
4Load cart11/04/2023 11:12:51NULL2
5Sort cart11/04/2023 11:22:01Blue2
6Distribute11/04/2023 12:12:35B2
7Load cart11/05/2023 06:22:17NULL3
8Sort cart11/05/2023 08:19:21Magenta3
9Distribute11/05/2023 14:12:01M3

期望输出

Action_IDAction_NameAction_DTTMDeptShift_IDShift_loc
1Load cart11/01/2023 14:12:01NULL1Magenta
2Sort cart11/01/2023 16:12:23Magenta1Magenta
3Distribute11/01/2023 16:17:14M1Magenta
4Load cart11/04/2023 11:12:51NULL2Blue
5Sort cart11/04/2023 11:22:01Blue2Blue
6Distribute11/04/2023 12:12:35B2Blue
7Load cart11/05/2023 06:22:17NULL3Magenta
8Sort cart11/05/2023 08:19:21Magenta3Magenta
9Distribute11/05/2023 14:12:01M3Magenta

用户尝试过CASE表达式但不知道如何在Shift分区内结合两列赋值,也考虑过FIRST_VALUE函数但不清楚如何定位分区内有效Dept值。

解决方案

方法1:使用MAX()结合窗口函数

利用每个Shift_ID分区内Sort cart对应的Dept是唯一值的特点,用MAX()聚合并按Shift_ID分区,直接提取该值作为Shift_loc:

SELECT 
    Action_ID,
    Action_Name,
    Action_DTTM,
    Dept,
    Shift_ID,
    MAX(CASE WHEN Action_Name = 'Sort cart' THEN Dept END) OVER (PARTITION BY Shift_ID) AS Shift_loc
FROM 
    worker_actions;

原理:CASE表达式仅在Action_Name为Sort cart时返回对应的Dept,否则返回NULL;窗口函数按Shift_ID分区后,MAX会忽略NULL,直接取分区内唯一的有效Dept值,赋值给该分区所有行。

方法2:使用FIRST_VALUE()结合条件排序

通过排序让Sort cart的记录排在分区最前面,再用FIRST_VALUE()提取对应Dept:

SELECT 
    Action_ID,
    Action_Name,
    Action_DTTM,
    Dept,
    Shift_ID,
    FIRST_VALUE(Dept) OVER (
        PARTITION BY Shift_ID 
        ORDER BY CASE WHEN Action_Name = 'Sort cart' THEN 0 ELSE 1 END
    ) AS Shift_loc
FROM 
    worker_actions;

原理:排序条件将Sort cart的记录优先级设为0(排在最前),其他记录为1;FIRST_VALUE()会提取分区内第一行的Dept值,也就是Sort cart对应的Dept,赋值给该分区所有行。

如果每个Shift_ID内可能有多条Sort cart记录且Dept一致,两种方法都适用;若存在多值,可根据需求调整聚合函数(比如取最新时间的Dept,此时需结合Action_DTTM排序)。


内容的提问来源于stack exchange,提问作者crackersNcheese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 11:54:53