在SQL Impala中生成连续交易日标识变量trade_day的方法
Impala中为重复交易日生成唯一标识的实现方法
你需要为数据集中重复的trade_date生成唯一的trade_day,要求每个交易日对应唯一标识,且自动跳过无交易的日期(比如示例中2016-07-03无数据,标识直接从20637跳到20639)。在Impala中可以通过以下两种方式实现:
方法一:生成与示例一致的基准日天数标识
示例里的trade_day是交易日期到1960-01-01的天数,我们可以先提取唯一交易日计算该值,再关联回原表:
-- 先获取唯一交易日及对应的trade_day WITH unique_trade_dates AS ( SELECT DISTINCT trade_date, DATEDIFF(trade_date, '1960-01-01') AS trade_day FROM your_table_name ORDER BY trade_date ) -- 关联回原表,给所有重复日期填充相同标识 SELECT t.trade_date, utd.trade_day FROM your_table_name t JOIN unique_trade_dates utd ON t.trade_date = utd.trade_date;
方法二:生成连续整数标识(从1开始递增)
如果不需要基于特定基准日的数值,只需要连续的唯一整数,用窗口函数DENSE_RANK()就能直接实现:
SELECT trade_date, DENSE_RANK() OVER(ORDER BY trade_date) AS trade_day FROM your_table_name;
这种方式会给第一个交易日分配1,第二个交易日分配2,自动跳过无交易的日期(因为没有该日期的行,不会占用编号)。
补充说明
- Impala的
DATEDIFF(end_date, start_date)函数用于计算两个日期的天数差,返回end_date减start_date的结果。你可以根据需求替换示例中的基准日1960-01-01。 DENSE_RANK()会按日期顺序为每个唯一交易日分配连续排名,相同日期会得到相同的排名值,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

