我想使用SQL数据库表中存在的DateCountid列添加三个列LDateTCountLApprover.

该过程涉及特定的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;

得出LApprover列的逻辑涉及根据与LDateDate列相关的条件 Select 最大批准者.SQL查询如下:

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

当前表格:

Date Count id Approver
2022-04-13 14:49:15.0000000 1 E3 Sourav
2020-04-13 17:49:15.0000000 1 E3 Soumyajit
2019-05-15 19:49:15.0000000 1 E3 Raju

预期结果:

LDate Count TCount Approver LApprover Date id
2022-04-13 14:49:15.0000000 1 3 Sourav Sourav 2022-04-13 14:49:15.0000000 E3
2022-04-13 14:49:15.0000000 1 3 Soumyajit Sourav 2020-04-13 17:49:15.0000000 E3
2022-04-13 14:49:15.0000000 1 3 Raju Sourav 2019-05-15 19:49:15.0000000 E3

我已try 此查询,但未获得预期结果:

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 Count TCount Approver LApprover LDate id
2022-04-13 14:49:15.0000000 1 3 Sourav Sourav 2022-04-13 14:49:15.0000000 E3
2022-04-13 14:49:15.0000000 1 3 Soumyajit NULL 2020-04-13 17:49:15.0000000 E3
2022-04-13 14:49:15.0000000 1 3 Raju NULL 2019-05-15 19:49:15.0000000 E3

推荐答案

没有必要进行如此复杂的连接.为此,您只需使用窗口函数即可.

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<>fiddle

Sql相关问答推荐

如何更改函数返回的列名?

使用Mac日志(log)时间找出SQL中的好小时和坏小时

在Golang中管理数据库事务的简洁方法

Postgres:对包含数字的字符串列表进行排序

为什么两个不同的窗口函数给出不同的排序结果?

如何嵌套两条SQL语句

在Oracle SQL中将列值转换为行

我如何才能在付款人单列中拉出只有9个付款人单的人?

每个学校 Select N个最新的行,但跳过同一学生的重复行

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

违反了完整性约束-值存在时找不到父键

删除行而不使数据库超载

将时间戳四舍五入到最近 10 分钟的查询

Postgres更新增量之间的差异

Select 多年的日期范围

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

从多个连接返回 1 行到同一个表 - SQL Server

在 SQL 中将行显示为列

遍历数据,计算每个月最后三天的总和

如何根据时间在 MongoDB Compass 中分组?