Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将一系列更新的日期转换为开始日期行和结束日期行_Sql_Date_Version_Transpose - Fatal编程技术网

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

SQL-将一系列更新的日期转换为开始日期行和结束日期行,sql,date,version,transpose,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

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

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
我想重铸或转置这个表,以便它列出每个属性值的开始和结束日期。这样我就可以在开始日期和结束日期之间选择一个任意的日期和do date来获取该日期的值

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,但我认为解决方案是独立于平台的…

这可能是您想要的

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

一个很好的解决方案是关联子查询:

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的属性在连续的行上具有相同的值时,即使为NULL,它们都会获得相同的结束日期。然后,查询使用此结束日期将它们分组。

结束日期似乎与示例数据没有关联。啊,这就是结束日期的来源。当属性从一个值更改为另一个值并再次更改时,mindate、maxdate解决方案将不起作用。记录将属性日期范围显示为重叠。。。真希望这么简单…@user548084-呃。。。好的,那么如何保持会话的不同?