如何编写与给定R代码逻辑等价的SQL/Teradata查询语句
Teradata 适配等价查询实现
以下语句完全对齐原R/dbplyr生成逻辑的运算规则,可直接在Teradata环境运行:
SELECT ID, Date, Agent, "group" FROM ( SELECT *, RANK() OVER (PARTITION BY ID, "group", Agent ORDER BY Date) AS q01 FROM ( SELECT ID, CAST(Date AS DATE) AS Date, Agent, -- 对齐原difftime周差逻辑:日期相减得间隔天数,除以28(4*7天)向上取整得到4周周期分组 CEILING(CAST((CAST(Date AS DATE) - MIN(CAST(Date AS DATE)) OVER (PARTITION BY ID)) AS FLOAT) / 28.0) AS "group" FROM dbplyr_003 ) calc_group ) calc_rank WHERE q01 <= 1 ;
适配说明
- Teradata原生不支持R里的
difftime函数,数据库中DATE类型直接相减即可得到间隔天数,除以28(即4周总天数)的计算结果和原代码按周差除以4取上整的逻辑完全一致 - 给
group字段加双引号是因为group是SQL保留字,避免Teradata语法解析报错,字段名和原逻辑完全一致 - 保留原逻辑的
RANK()开窗规则:如果同一ID、同一4周分组、同一Agent下存在多条日期相同的最早记录,会全部返回,和原R代码运行结果无差异 - 简化了原dbplyr生成的冗余嵌套层级,执行效率更高,逻辑无任何改动
内容的提问来源于stack exchange,提问作者Santosh Ranpise
相关产品推荐
相关产品推荐

