Sql 为具有特定模式的组分配唯一键

Posted

技术标签:

【中文标题】Sql 为具有特定模式的组分配唯一键【英文标题】:Sql assign unique key to groups having particular pattern 【发布时间】:2020-11-02 21:20:23 【问题描述】:

您好,我正在尝试根据特定模式对数据进行分组。

我有一个如下两列的表格,

Name  rollingsum
 A        5
 A        10
 A        0
 A        5
 A        0
 B        6
 B        0

我需要生成一个键列,只有在遇到rollingsum等于0后才会增加。如下所示

Name   rollingsum   key
  A       5          1
  A       10         1
  A        0         1
  A        5         2
  A        0         2
  B        6         3
  B        0         3

我正在使用 postgres,我尝试在 case 语句中增加变量,如下所示

Declare a int;
a:=1;

........etc 
Case when rolling sum =0 then a:=a+1 else a end as key

但我在附近遇到错误:

提前感谢所有帮助

【问题讨论】:

【参考方案1】:

您需要一个排序列,因为结果取决于行的排序 -- 而 SQL 表表示 无序 集。

然后对数据末尾的 0 个计数进行累积总和。那是相反的顺序,所以从总数中减去:

select t.*,
       (1 + sum( (rolling_sum = 0)::int ) over () -
        sum( (rolling_sum = 0)::int ) over (order by ordercol desc)
       ) as key
from t;

【讨论】:

【参考方案2】:

假设您有一个名为 id 的列来对行进行排序,这里有一个使用累积计数和窗口框架的选项:

select name, rollingsum,
    1 + count(*) filter(where rollingsum = 0) over(
        order by id
        rows between unbounded preceding and 1 preceding
    ) as key
from mytable

Demo on DB Fiddle

姓名 |滚动和|钥匙 :--- | ---------: | --: 一个 | 5 | 1 一个 | 10 | 1 一个 | 0 | 1 一个 | 5 | 2 一个 | 0 | 2 乙| 6 | 3 乙| 0 | 3

【讨论】:

以上是关于Sql 为具有特定模式的组分配唯一键的主要内容,如果未能解决你的问题,请参考以下文章

使用特定模式访问 SQL 查询选择

MGR——Mysql的组复制之多主模式

SAS/PROC-SQL 从具有唯一键的表转换为具有相同键的多行表

[MGR——Mysql的组复制之多主模式 ] 详细搭建部署过程

动态分配唯一值 - Python

具有精确键列表的模式匹配映射