在一个 select 语句中按组 SQL 计算的累计数量

Cumulative number by group SQL in one select statement

提问人:Joost Oskam 提问时间:6/23/2023 最后编辑:GMBJoost Oskam 更新时间:6/23/2023 访问量:46

问:

数据如下所示:

编号 日期 地位
1 01012020 应用程序接口 新增功能
1 02012020 雷姆科
1 03012020 应用程序接口 重新计算
1 04012020 鲁德
1 05012020 应用程序接口 重新计算
1 06012020 迈克尔 好的,额外的信息
1 07012020 罗伊
1 08012020 罗伊

我必须添加一行来显示此 ID 的版本。当 API 以外的人处理 ID 后,版本会增加。

序列应以 1 开头。

因此,结果应如下所示:

编号 日期 地位 版本
1 01012020 应用程序接口 新增功能 1
1 02012020 雷姆科 1
1 03012020 应用程序接口 重新计算 2
1 04012020 鲁德 2
1 05012020 应用程序接口 重新计算 3
1 06012020 迈克尔 好的,额外的信息 3
1 07012020 罗伊 4
1 08012020 罗伊 5

当然,您可以使用 CTE 或 INNER JOIN。但是我需要这个结果出现在 SELECT 语句中。我试过了这个:

SUM(    case    when STATUS IN ( 'NEW', 'RECALC') THEN 0
                else 1 end)
over( partition by ID order by Date asc)

as VERSION

这几乎可以做到,但是当一个人处理版本时,会停止添加版本号。它不应该这样做。

如果不清楚,请问!

SUM(    case    when STATUS IN ( 'NEW', 'RECALC') THEN 0
                else 1 end)
over( partition by ID order by Date asc)

as VERSION

当一个人不断处理版本时,这将停止添加版本。它应该不断增加版本。

当一个人完成它时,它基本上需要添加一个版本号。因此,一个人查看 ID 后的行应该添加 1。API不是一个人,其他人都是:)

SQL 计数 序列 窗口函数

评论

0赞 Joost Oskam 6/23/2023
那没有用。它停止了最后三条记录的加起来。

答:

0赞 GMB 6/23/2023 #1

当 API 以外的人处理 ID ,版本会增加。

这读取起来类似于所有先前行(不包括当前行)的“非 API”行计数。

您没有标记您的数据库。一种合理的可移植方法是用条件 表示计数,并使用语法来调整窗口框架:sumrows between

select  t.*,
    1 + coalesce(
        sum(case when person != 'API' then 1 else 0 end) over(
            partition by id
            order by date
            rows between unbounded preceding and 1 preceding
        ),
        0
      ) as grp
from mytable t
order by id, date

小提琴

编号 日期 地位 GRP的
1 2020-01-01 应用程序接口 新增功能 1
1 2020-01-02 雷姆科 1
1 2020-01-03 应用程序接口 重新计算 2
1 2020-01-04 鲁德 2
1 2020-01-05 应用程序接口 重新计算 3
1 2020-01-06 迈克尔 好的,额外的信息 3
1 2020-01-07 罗伊 4
1 2020-01-08 罗伊 5

评论

0赞 Joost Oskam 6/23/2023
你刚刚拯救了我的一天!如果你有时间,你能解释一下它是如何工作的吗?尤其是前面的无界行和前面的 1 行
0赞 GMB 6/23/2023
@JoostOskam: 表示:考虑前面的所有行(由子句定义),但不考虑当前行。rows between unbounded preceding and 1 precedingorder by date