4

我无法为我的问题提出有效的 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 查询的解决方案:(希望有人可以帮助我

提前致谢

4

2 回答 2

2

用于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
于 2016-12-15T14:52:16.407 回答
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
于 2016-12-15T15:15:47.647 回答