如何只对部分记录求和



我正在努力与SQL Server中的窗口函数。我有一个跟踪有多少记录被转移的表。我编写了一个查询来对每个参数传输的行数求和。然而,在某些时候,记录必须重新发送(它们从最终位置删除并重新发送)。所以,如果我继续我的旧查询,我得到重复的值。

这是一个示例表:

03.11.2022

稍微调整一下,就可以得到如下结果:

SELECT parameter, sum(rows) as sum, min(min_id) as min_id, max(max_id) as max_id,
max(create_date) as max_date
FROM
(SELECT 
parameter
, rows
, min_id
, max_id
, create_date
, status
, MAX(case when min_id = 1 then create_date end) over (partition by parameter) as sent_start
FROM my_table) as s
WHERE create_date >= sent_start and status = 'sent'
GROUP BY parameter

值得考虑数据的变化。min_id大于1的记录可以重发吗?记录可以在同一天内发送和重发吗?

如果可能存在以上任何一种情况,您可能需要使用EXISTS条件进行测试:

选项2

;WITH SentRows as
(
SELECT *
FROM my_table
WHERE status='sent'
)
SELECT parameter, sum(rows) as sum, min(min_id) as min_id, max(max_id) as max_id,
max(create_date) as max_date 
FROM SentRows as s
WHERE NOT EXISTS
(SELECT 1 FROM SentRows t WHERE t.parameter = s.parameter AND t.create_date > s.create_date 
AND t.min_id <= s.min_id AND t.max_id >= s.max_id)
GROUP BY parameter

对于部分重叠的记录,您可能希望使用窗口函数,但这里不需要。

不使用分区,您可以尝试使用GROUP BY子句,因为您期望的输出可能在所有列中都有聚合。您可以尝试下面的查询:

SELECT
parameter, 
SUM(rows) AS rows, 
MIN(min_id) AS min_id,
MAX(max_id) AS max_id,
MAX(create_date) AS max_date 
FROM my_table
WHERE status = 'sent'
GROUP BY parameter

这将给出您期望的输出。但是,如果你想用你的旧查询和重复是唯一的问题,你可以尝试使用SELECT后的DISTINCT关键字给你唯一的记录。

最新更新