SQL:从一个日期列生成valid_from和valid_to日期

时间:2016-12-15 14:47:26

标签: sql sql-server sybase customer

我无法为我的问题提出有效的SQL查询,希望有人可以帮助我。

我有一个表(Sybase IQ),它包含不同客户的数据及其在某个时间点的客户价值:

旧客户价值表:

customer_id | load_date   | customer_value
5           |  2016-01-01 | Basic
5           |  2016-04-01 | Premium
5           |  2016-08-01 | Gold
6           |  2016-01-01 | Basic
6           |  2016-04-01 | Premium
6           |  2016-08-01 | Gold
7           |  2016-01-01 | Basic
7           |  2016-04-01 | Premium
7           |  2016-08-01 | Gold

要将此表与其他表连接,我必须知道在特定时间范围内客户的有效customer_value是什么。 因此,我们的想法是转换上表并使用以下格式创建一个新表:

要创建的新客户价值表

customer_id | date_valid_from | date_valid_to | customer_value
5           |  2016-01-01     | 2016-03-31    | Basic
5           |  2016-04-01     | 2016-08-24    | Premium
5           |  2016-08-25     | NULL          | Gold
6           |  2016-01-01     | 2016-03-31    | Basic
6           |  2016-04-01     | 2016-08-24    | Premium
6           |  2016-08-25     | NULL          | Gold
7           |  2016-01-01     | 2016-03-31    | Basic
7           |  2016-04-01     | 2016-08-24    | Premium
7           |  2016-08-25     | NULL          | Gold

可悲的是,我无法找到任何能够创建所需输出的SQL查询的解决方案:( 希望有人能帮助我

提前致谢

2 个答案:

答案 0 :(得分:1)

使用lead获取下一行的日期并从中减去1天以获取句点的结束日期。

select customer_id,date_valid_from,
dateadd(day,-1,next_date) date_valid_to,customer_value 
from (
select 
customer_id,
load_date as date_valid_from,
lead(load_date) over(partition by customer_id order by load_date) as next_date,
customer_value 
from tablename
) x

答案 1 :(得分:0)

您可以像这样查询

select customer_id, load_date as datefrom, 
 dateto= dateadd(day, -1, lead(load_date) over(partition by customer_id order by customer_id, load_date)) , customer_value 
 from yourCustomer