SQL - 将一系列更新日期转换为开始日期和结束日期的行

时间:2013-01-15 19:48:29

标签: sql date version transpose

我有一种属性记录表,其中包含客户列表,属性和日期。此表每月更新一次,包含所有客户的当前属性值。

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,但我认为该解决方案与平台无关......

2 个答案:

答案 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)。然后,查询使用此结束日期将它们分组在一起。