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 为具有特定模式的组分配唯一键的主要内容,如果未能解决你的问题,请参考以下文章
SAS/PROC-SQL 从具有唯一键的表转换为具有相同键的多行表