我有一个表,每个id都有不同的长度,每个不同id的Date_Column值是相同的:

id     date_column
A      2020-05-20
A      2020-05-20
A      2020-05-20
B      2020-07-23    
B      2020-07-23
C      2021-08-27
C      2021-08-27

我想知道是否有可能添加一个额外生成的列 通过日期序列,其中每个开始日期值将是日期列上每个ID的唯一日期值,后续值将是减go 一个月的起始值,第二个值将是减go 两个月的起始值,依此类推,直到出现新的ID并且出现新的开始日期值,将为其生成新的序列.

预期输出应如下所示-

id     date_column      generated_column    
A      2020-05-20        2020-05-20
A      2020-05-20        2020-04-20
A      2020-05-20        2020-03-20
B      2020-07-23        2020-07-23
B      2020-07-23        2020-06-23
C      2021-08-27        2021-08-27
C      2021-08-27        2021-07-27

是否可以通过在Snowflake中使用SQL来添加此列?

推荐答案

所以就像NBK说的,Radagast注意到了,但形式更容易读懂(Imho):

with fake_data(id, date_coumn) as (
    select * from values
        ('A', '2020-05-20'::date),
        ('A', '2020-05-20'::date),
        ('A', '2020-05-20'::date),
        ('B', '2020-07-23'::date),    
        ('B', '2020-07-23'::date),
        ('C', '2021-08-27'::date),
        ('C', '2021-08-27'::date)
)
select *
    ,row_number() over (partition by id order by null)-1 as rn
    ,dateadd('month', -rn, date_coumn) as gen_column
from fake_data
order by 1,gen_column desc;

提供:

enter image description here

它显示了row_number如何 for each id生成具有独立数字范围的值,以及如何没有要对这些值进行排序的值,但是您可以通过提供一个常量值来解决这个问题,其中null的效果非常好. 然后是如何使用dateadd来"添加"负数月份.

根据Radagast的回答,这两行可以混合在一起,但这可能很难阅读/推理,所以另一个应该等同于相同执行的解决方法是以显式形式保留它,并通过子 Select Like来删除rn列:

select * exclude(rn) from (
    select *
        ,row_number() over (partition by id order by null)-1 as rn
        ,dateadd('month', -rn, date_coumn) as gen_column
    from fake_data
)
order by 1,gen_column desc;

给予:

enter image description here

Sql相关问答推荐

跨多列的PostgreSQL非不同对

在甲骨文中查找前一个星期一的S日期

当交叉联接3个或更多表时,实体框架中是否会传输冗余的行数据并占用数据库带宽?

为什么两个不同的窗口函数给出不同的排序结果?

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

值对于类型字符来说太长

使用generate_series()时,LEFT联接缺少日期/间隔

我可以在SQLite3中使用BLOB作为主键吗?

从类似JSON的字符串列创建新列

根据是否出现过零来筛选数据(跨多行)

排除具有部分匹配条件的记录

SQL查询正在工作,但返回空结果

如何使子查询在UPDATE语句期间获得最新更新

Postgresql 生成器列导致语法错误

SQL 语句将一列中的值与另一列中的不同值相加,同时按第三列进行分组?

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

SQL 按 id 运行总计并受条件限制(在窗口上)

如何根据某个值在where子句中添加某个条件

我现在如何显示重复的汽车? postgresql

在 Snowflake SQL 中计算通货inflating 率