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

基于现有字段新增SQL列异常:LDate、TCount、LApprover结果不符

修正SQL语句以实现新增列需求

需求规则

基于SQL表中现有Date、Count、id字段,新增LDate、TCount、LApprover三列,规则如下:

  • TCount:按id分组的Count字段总和
    SELECT SUM(Count) AS TCount 
    FROM db 
    GROUP BY id; 
    
  • LDate:按id分组的Date字段最大值
    SELECT MAX(Date) AS LDate 
    FROM db 
    GROUP BY id;
    
  • LApprover:取LDate对应行的Approver,当LDate=Date或LDate为空时取该行Approver
    SELECT
        MAX(CASE 
                WHEN [LDate] = [Date] OR [LDate] IS NULL 
                    THEN [Approver] 
                    ELSE NULL 
            END) AS [LApprover] 
    FROM db 
    GROUP BY id; 
    

当前表数据

DateCountidApprover
2022-04-13 14:49:15.00000001E3Sourav
2020-04-13 17:49:15.00000001E3Soumyajit
2019-05-15 19:49:15.00000001E3Raju

预期结果

LDateCountTCountApproverLApproverDateid
2022-04-13 14:49:15.000000013SouravSourav2022-04-13 14:49:15.0000000E3
2022-04-13 14:49:15.000000013SoumyajitSourav2020-04-13 17:49:15.0000000E3
2022-04-13 14:49:15.000000013RajuSourav2019-05-15 19:49:15.0000000E3

已尝试的SQL及问题

原SQL语句:

WITH CombinedCTE AS 
(
    SELECT 
        q1.id, q2.Count, 
        q1.[TCount], q2.Date, q1.LDate, q2.Approver 
    FROM 
        (SELECT 
             id, COUNT(Count) AS [TCount], MAX([Date]) AS LDate 
         FROM 
             db 
         GROUP BY 
             id) q1    
    JOIN 
        (SELECT id, Count, [Date], Approver 
         FROM db) q2  ON q1.id = q2.id 
    WHERE 
        q2.id = 'E3' 
)
SELECT 
    id, Approver, Count, TCount, Date, LDate,
    MAX(CASE WHEN [LDate] IS NULL OR [LDate] = [Date] THEN [Approver] ELSE NULL END) AS [LApprover] 
FROM 
    (SELECT * FROM CombinedCTE) SubQuery
GROUP BY 
    id, Approver, Count, TCount, Date, LDate 

实际返回结果(部分LApprover为NULL):

LDateCountTCountApproverLApproverDateid
2022-04-13 14:49:15.000000013SouravSourav2022-04-13 14:49:15.0000000E3
2022-04-13 14:49:15.000000013SoumyajitNULL2020-04-13 17:49:15.0000000E3
2022-04-13 14:49:15.000000013RajuNULL2019-05-15 19:49:15.0000000E3

问题原因:原SQL的GROUP BY包含了Approver、Date等行级字段,导致每一行单独成为一个分组,MAX函数仅对当前行生效,非匹配行的CASE返回NULL,最终LApprover就是NULL。

修正后的SQL语句

WITH IdAggregates AS (
    SELECT 
        id,
        SUM(Count) AS TCount,
        MAX(Date) AS LDate,
        MAX(CASE WHEN Date = MAX(Date) THEN Approver END) AS LApprover
    FROM db
    GROUP BY id
)
SELECT 
    ia.LDate,
    db.Count,
    ia.TCount,
    db.Approver,
    ia.LApprover,
    db.Date,
    db.id
FROM db
JOIN IdAggregates ia ON db.id = ia.id
WHERE db.id = 'E3'
ORDER BY db.Date DESC;

说明

  1. 先通过IdAggregates CTE计算每个id的三个聚合值:TCount(总和)、LDate(最大日期)、LApprover(最大日期对应的审批人)。这里直接在分组聚合时计算LApprover,利用MAX(Date)匹配对应行的Approver。
  2. 将原表与IdAggregates按id关联,这样每一行都能拿到对应id的三个聚合字段,无需再对行级字段分组,确保所有行的LApprover都能正确显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:28:14