我有一种属性记录表,其中包含客户列表,属性和日期。此表每月更新一次,包含所有客户的当前属性值。
id attr_val date
1 red 2012-01-01
1 red 2012-02-01
1 blue 2012-03-01
2 green 2012-01-01
2 green 2012-02-01
2 green 2012-03-01
我想重新设置或转置此表,以便列出每个属性值的开始和结束日期。这样我可以采取任意日期并date between start_dt and end_dt
来获取该日期的值。
id attr_val start_dt end_dt
1 red 2012-01-01 2012-02-28
1 blue 2012-03-01 NULL
2 green 2012-01-01 NULL
使用单个SQL命令可以实现这一点,还是需要运行某种更复杂的脚本?目标环境是Teradata,但我认为该解决方案与平台无关......
答案 0 :(得分:1)
这可能是你想要的
SELECT id, attr_val, min(date) as start_dt, max(date) as end_dt
FROM tablename
GROUP BY id, attr_val
或者这个:
SELECT id, attr_val, min(date) as start_dt,CASE WHEN max(date) > min(date) THEN max(date) ELSE null END as end_dt
FROM tablename
GROUP BY id, attr_val
答案 1 :(得分:1)
一个很好的解决方案是相关的子查询:
select id, attr_val, min(date) as start_date, end_date
from (select t.*,
(select min(date) - 1 from t t2 where t2.id = t.id and t2.date > t.date and t2.attr_val <> t.attr_val
) as end_date
from t
) t
group by id, attr_val, end_date
这将计算给定id和属性值的属性不同的下一个日期。比这个日期少一个是结束日期。当给定id的属性在连续行上具有相同的值时,它们都获得相同的end_date(即使为NULL)。然后,查询使用此结束日期将它们分组在一起。