Snowflake SQL 如何删除最近一个周日之前的视图数据
实现方案
首先明确:普通逻辑视图为虚拟表,不支持直接删除行,你可以选择操作视图对应的底层基表,或者直接修改视图查询逻辑过滤掉不符合要求的行,无需删除底层数据。
核心思路
基于Snowflake内置的日期函数动态计算最近的周日日期,完全不需要硬编码。你已有的星期几计算列规则(周一=1、周日=7)和Snowflake自带的DAYOFWEEKISO函数返回规则完全一致,可以直接复用。
方法1:基于当前系统时间计算最近周日
适合需要和实际日期对齐的场景
- 先定义动态最近周日变量
-- 如果当天是周日则取当天,否则取上周日 SET latest_sunday = IFF(DAYOFWEEKISO(CURRENT_DATE()) = 7, CURRENT_DATE(), DATEADD('day', -DAYOFWEEKISO(CURRENT_DATE()), CURRENT_DATE()));
- 执行删除(针对基表)
DELETE FROM 你的基表名称 WHERE TO_DATE(你的日期字段名, 'DD-MM-YYYY') < $latest_sunday;
- 如果直接修改视图逻辑,无需删除数据:
CREATE OR REPLACE VIEW 你的视图名称 AS SELECT * FROM 原表/原视图 WHERE TO_DATE(你的日期字段名, 'DD-MM-YYYY') >= IFF(DAYOFWEEKISO(CURRENT_DATE()) = 7, CURRENT_DATE(), DATEADD('day', -DAYOFWEEKISO(CURRENT_DATE()), CURRENT_DATE()));
方法2:基于数据内存在的周日计算
适合数据存在日期缺失,需要取数据中最新的周日作为基准的场景,可直接复用你已有的星期几计算列
DELETE FROM 你的基表名称 WHERE TO_DATE(你的日期字段名, 'DD-MM-YYYY') < ( -- 取数据中最新的周日日期 SELECT MAX(TO_DATE(你的日期字段名, 'DD-MM-YYYY')) FROM 你的基表名称 WHERE 你的星期几计算列名称 = 7 );
注意事项
- 执行删除前建议先运行SELECT语句验证过滤结果,避免误删:
SELECT * FROM 你的基表名称 WHERE TO_DATE(你的日期字段名, 'DD-MM-YYYY') < 你计算出的周日基准日期;
- 如果你的日期字段已经是日期类型而非字符串,可以去掉
TO_DATE转换步骤直接使用。
内容的提问来源于stack exchange,提问作者katlsale
相关产品推荐
相关产品推荐

