``` -- 不包含进度节点的表(维度分布表) -- 筛选条件 国家、车型、产品线、项目名称、项目编码 SELECT P1.code project_code, P1.name project_name, P1.plan_starttime , P1.plan_endtime , P1.real_starttime , P1.real_endtime , P2.name country, P3.name project_state, P4.name product_line, P5.name project_type, CASE WHEN P3.name = '已完成' AND P1.real_endtime > P1.plan_endtime THEN '延期完成' WHEN P3.name = '已完成' AND P1.real_endtime <= P1.plan_endtime THEN '正常完成' WHEN P3.name = '已终止' THEN '已终止' WHEN P3.name = '已暂停' THEN '已暂停' WHEN P3.name = '执行中' AND CURRENT_TIMESTAMP() > P1.plan_endtime THEN '执行中延期' WHEN P3.name = '执行中' AND CURRENT_TIMESTAMP() <= P1.plan_endtime THEN '正常' WHEN P3.name = '编制中' THEN NULL ELSE NULL END status_light FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_17010_hw_dev15oc_1054010535 P1 LEFT JOIN (SELECT id, name FROM view.view.ic_dev15oc_mart.view_ods_plm_bd_cust_doc_17010_dev15oc_1054010535 WHERE name IN ('泰国', '巴西', '匈牙利', '印尼', '土耳其', '乌兹')) P2 ON P1.areafdkj = P2.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_base_lc_st_17010_dev15oc_1054010535 P3 ON P1.lifecycle_attrpool_id = P3.id LEFT JOIN (SELECT id, name FROM view.ic_dev15oc_mart.view_ods_plm_org_admin_17010_dev15oc_1054480402 WHERE parentid = '1618991418594820098') P4 ON P1.ownedorg = P4.id LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_prj_cgr_17010_dev15oc_1054010535 P5 ON P1.classify_id = P5.id WHERE P1.real_endtime IS NOT NULL; /* SELECT * FROM view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_task_type_17010_dev15oc_1054010535 P7 SELECT * FROM view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_role_17010_dev15oc_1054010535 P8 SELECT * FROM view.ic_dev15oc_mart.view_ods_plm_bd_staff_17010_dev15oc_1054480385 P9 SELECT * FROM view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_prj_t_dt_17010_dev15oc_1054010535 P10 */```请在这段spark sql后面新增一列系统修改时间
接下来,我需要确定系统修改时间字段是否存在。通常这种字段可能叫做update_time、modified_time或者sys_update_time之类的。用户可能没有在现有的SELECT部分看到这个字段,所以需要检查主表P1是否包含这个字段。比如,假设主表中有一个字段叫做sys_update_time或者last_modified,那么直接选择它即可。
如果主表P1确实有系统修改时间的字段,那么修改就比较简单,直接在SELECT列表中添加P1.sys_update_time AS system_modified_time。但需要确认字段名是否正确,可能需要查看表结构或者样例数据。
另外,用户可能没有权限或者不了解表结构,所以需要根据常见的命名习惯推测。比如,如果主表没有,可能需要连接其他表。但根据用户提供的其他注释部分,比如view_ods_plm_imp_plm_pm_prj_t_dt_17010这个表(别名为P10),里面可能有相关的日期字段,比如update_time。这时候可能需要LEFT JOIN这个表来获取。
不过,用户当前的查询中并没有用到P10,而是注释掉了。所以可能需要取消注释并添加JOIN条件。例如,如果P10和P1通过某个ID关联,比如P1.id = P10.prj_id,那么可以LEFT JOIN这个表,并选择P10.update_time作为系统修改时间。
但用户的问题是在现有SQL后面新增一列,可能希望尽量少改动现有的JOIN结构。如果主表P1本身就有这个字段,那最简单。否则,需要添加新的JOIN。
现在回到用户的原始SQL,主表P1的字段可能包括系统修改时间,但未被选中。所以第一步是检查P1是否有该字段。例如,查看是否有类似last_updated或sys_modified_time的列。如果有,直接添加即可。
假设存在字段sys_update_time,那么修改后的SELECT语句会新增一列:
SELECT ...原有字段... P1.sys_update_time AS system_modified_time FROM ...
如果没有,可能需要从其他表中获取。例如,P10表可能有相关信息,但需要确定关联条件。例如,原SQL中的注释部分提到了P10是view_ods_plm_imp_plm_pm_prj_t_dt_17010,可能存储了项目的时间数据,包括修改时间。
这时需要添加LEFT JOIN:
LEFT JOIN view.ic_dev15oc_mart.view_ods_plm_imp_plm_pm_prj_t_dt_17010_dev15oc_1054010535 P10 ON P1.id = P10.prj_id
然后在SELECT中添加P10.update_time AS system_modified_time。
不过用户可能希望用最少的改动完成,所以优先考虑主表是否存在该字段。如果存在,直接添加;否则,需要JOIN其他表。
现在,我需要给出具体的修改步骤,并确保语法正确,使用正确的别名和字段名。同时,提醒用户确认字段是否存在,避免因字段名错误导致的问题。好的,我们通过以下步骤在查询结果中新增系统修改时间列:
- 定位修改时间字段:
- 主表
P1
(view_dwd_plm_imp_plm_pm_prj_17010_hw_dev15oc_1054010535)中通常包含sys_update_time
或last_modified_time
字段 - 字段需用反引号包裹(部分系统区分大小写)
修改后的SQL: ```sql SELECT P1.code project_code, P1.name project_name, P1.plan_starttime , P1.plan_endtime , P1.real_starttime , P1.real_endtime , P2.name country, P3.name project_state, P4.name product_line, P5.name project_type,
P1.sys_update_time
AS system_modified_time, -- 新增系统修改时间列CASE -- ...原有CASE逻辑保持不变... END status_light
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_17010_hw_dev15oc_1054010535 P1 -- ...后续JOIN逻辑保持不变...
```
- 注意事项:
- 若字段不存在需验证表结构:
DESCRIBE view_dwd_plm_imp_plm_pm_prj_17010_hw_dev15oc_1054010535
- 时间格式转换建议(如需):
DATE_FORMAT(P1.sys_update_time, 'yyyy-MM-dd HH:mm:ss')
- 空值处理可添加:
COALESCE(P1.sys_update_time, '1900-01-01')
- 若字段不存在需验证表结构:
完整代码片段可参考原始SQL结构添加,建议通过EXPLAIN
命令验证执行计划优化。
相关推荐












