使用 SQL 数据库中的现有列派生或修改几列

Derive or modify a few columns using an existing column in SQL database

提问人:Sourav Guha 提问时间:11/12/2023 最后编辑:Dale KSourav Guha 更新时间:11/13/2023 访问量:49

问:

我想添加三列,并使用 、 列,这些列存在于 SQL 数据库表中。LDateTCountLApproverDateCountid

该过程涉及特定的 SQL 查询,以提取每个新列的相关信息。

第一步是通过执行以下 SQL 查询来计算总计数,表示为TCount

SELECT SUM(Count) AS TCount 
FROM db 
GROUP BY id; 

我想使用以下 SQL 查询确定最长日期,标记为:LDate

SELECT MAX(Date) AS LDate 
FROM db 
GROUP BY id;

派生列的逻辑涉及根据与 和 列相关的条件选择最大审批者。SQL查询如下:LApproverLDateDate

SELECT
    MAX(CASE 
            WHEN [LDate] = [Date] OR [LDate] IS NULL 
                THEN [Approver] 
                ELSE NULL 
        END) AS [LApprover] 
FROM db 
GROUP BY id; 

当前表:

日期 计数 编号 审批者
2022-04-13 14:49:15.0000000 1 E3系列 苏拉夫
2020-04-13 17:49:15.0000000 1 E3系列 苏米亚吉特
2019-05-15 19:49:15.0000000 1 E3系列 拉朱

预期结果:

LDate 计数 TCount 审批者 LApprover的 日期 编号
2022-04-13 14:49:15.0000000 1 3 苏拉夫 苏拉夫 2022-04-13 14:49:15.0000000 E3系列
2022-04-13 14:49:15.0000000 1 3 苏米亚吉特 苏拉夫 2020-04-13 17:49:15.0000000 E3系列
2022-04-13 14:49:15.0000000 1 3 拉朱 苏拉夫 2019-05-15 19:49:15.0000000 E3系列

我已经尝试了这个查询,但我没有得到预期的结果:

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 

我得到的结果是这样的:

LDate 计数 TCount 审批者 LApprover的 LDate 编号
2022-04-13 14:49:15.0000000 1 3 苏拉夫 苏拉夫 2022-04-13 14:49:15.0000000 E3系列
2022-04-13 14:49:15.0000000 1 3 苏米亚吉特 2020-04-13 17:49:15.0000000 E3系列
2022-04-13 14:49:15.0000000 1 3 拉朱 2019-05-15 19:49:15.0000000 E3系列
sql-server 联接 azure-data-studio

评论

0赞 Mureinik 11/12/2023
问题到底是什么?你能澄清一下这个输出是如何不正确的吗?
0赞 Thom A 11/12/2023
为什么不直接使用 /,而不是所有这些 CTE/dervived 表呢?LAST_VALUEFIRST_VALUE
0赞 Sourav Guha 11/12/2023
我没有在整个“LApprover”列中获取值“Sourav”,而是遇到了这样一种情况:初始实例正确填充了“Sourav”,但其余两个值显示为 NULL。

答:

3赞 Charlieface 11/12/2023 #1

不需要如此复杂的连接。为此,您可以只使用窗口函数。

SELECT *,
  SUM(Count) OVER (PARTITION BY Id) AS TCount,
  MAX(Date) OVER (PARTITION BY Id) AS LDate,
  FIRST_VALUE(Approver) OVER
    (PARTITION BY Id ORDER BY Date DESC ROWS UNBOUNDED PRECEDING) AS LApprover
FROM db;

db<>小提琴