如何基于created_at时间戳列自动生成按周递增的分组新列?
自动按周生成递增标识列的解决方案
需求说明
现有表中的created_at时间戳列,需自动生成一个新列,同一周的日期对应相同的递增标识(如C10、C11),无需手动编写CASE语句维护。
示例数据
原始created_at列:
created_at ------------ 2024-04-08 2024-04-09 2024-04-13 2024-04-15 2024-04-16 2024-04-18 2024-04-22 2024-04-25
期望结果:
created_at | new_column --------------------------------- 2024-04-08 C10 2024-04-09 C10 2024-04-13 C10 2024-04-15 C11 2024-04-16 C11 2024-04-18 C11 2024-04-22 C12 2024-04-25 C12
自动化实现方案
使用窗口函数DENSE_RANK()结合日期截断函数DATE_TRUNC()实现,无需手动维护条件:
SELECT created_at, 'C' || (DENSE_RANK() OVER (ORDER BY DATE_TRUNC('week', created_at)) + 9) AS new_column FROM my_table ORDER BY created_at;
代码解释
DATE_TRUNC('week', created_at):将每个日期截断到所在周的起始日期,确保同一周的日期归为同一分组DENSE_RANK() OVER (ORDER BY ...):按周的起始日期排序,为每个不同的周分配递增的排名(第一周为1,第二周为2,以此类推)+9:将排名转换为从10开始的数字(排名1对应10,排名2对应11),与前缀C拼接得到目标标识ORDER BY created_at:保持结果行顺序与原始数据一致
内容的提问来源于stack exchange,提问作者dada
相关产品推荐
相关产品推荐

