提问人:Sourav Guha 提问时间:11/12/2023 最后编辑:Dale KSourav Guha 更新时间:11/13/2023 访问量:49
使用 SQL 数据库中的现有列派生或修改几列
Derive or modify a few columns using an existing column in SQL database
问:
我想添加三列,并使用 、 列,这些列存在于 SQL 数据库表中。LDate
TCount
LApprover
Date
Count
id
该过程涉及特定的 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查询如下:LApprover
LDate
Date
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系列 |
答:
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;
评论
LAST_VALUE
FIRST_VALUE