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

Sim*_*rle 6 sql sql-server sybase

我有一个表(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
Run Code Online (Sandbox Code Playgroud)

要将此表与其他表连接起来,我必须知道特定时间范围内客户的有效 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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我找不到任何可以为我创建所需输出的 ​​SQL 查询的解决方案。

Vam*_*ala 4

用于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
Run Code Online (Sandbox Code Playgroud)