【发布时间】:2022-12-03 08:35:41
【问题描述】:
我正在为 SQL Server 中的窗口函数而苦苦挣扎。我有一个表,用于跟踪传输了多少记录。我写了一个查询来计算每个参数传输了多少行。然而,在某些时候必须重新发送记录(它们从最终位置被丢弃并重新发送)。所以,如果我继续我的旧查询,我会得到重复的值。
这是一个示例表:
| parameter | rows | min_id | max_id | create_date | status |
|---|---|---|---|---|---|
| A1 | 48 | 350 | 521 | 06.11.2022 | sent |
| A1 | 48 | 350 | 521 | 06.11.2022 | error |
| A1 | 78 | 1 | 350 | 05.11.2022 | sent |
| A1 | 13 | 299 | 350 | 04.11.2022 | sent |
| A1 | 50 | 100 | 299 | 03.11.2022 | sent |
| A1 | 15 | 1 | 100 | 01.11.2022 | sent |
| B2 | 87 | 800 | 1202 | 07.11.2022 | sent |
| B2 | 187 | 1 | 800 | 06.11.2022 | sent |
| B2 | 12 | 570 | 800 | 04.11.2022 | sent |
| B2 | 120 | 320 | 570 | 03.11.2022 | sent |
| B2 | 55 | 1 | 320 | 01.11.2022 | sent |
当 min_id 再次为 1 时,您可以了解何时重新发送表。
我想要达到的结果是:
| parameter | sum | min_id | max_id | max_date |
|---|---|---|---|---|
| A1 | 126 | 1 | 521 | 06.11.2022 |
| B2 | 274 | 1 | 1202 | 07.11.2022 |
到目前为止我能做什么(但导致重复结果):
SELECT * FROM
(SELECT
parameter
, sum(rows) over (partition by parameter) as sum
, min_id
, max_id
, MAX(create_date) over (partition by parameter) as max_date
FROM my_table) as s
WHERE create_date = max_date and status = 'sent'
我认为可能还需要添加一个窗口函数(嵌套窗口函数?),这将使从 min_id=1 开始的特定范围的分区具有最新的 create_date。但是,我没有这样做。谁能建议如何处理这个问题?
【问题讨论】:
-
作为快速提示,您可以使用递归来执行此操作,或者使用条件窗口函数生成一个对每个“组”都相同的列,然后汇总
标签: sql sql-server window-functions