如何根据开始日期将记录与日期值一起显示。 SQL Server

问题描述 投票:-1回答:2

我有2个表,一个是日期列表,另一个是具有相应开始日期的对象列表。我想加入表格,以便ID出现在日期列表的日期旁边,因为它的开始日期大于或等于对象的开始日期。

 Date List      ID  StartDate           Result  
29/07/2016      1   29/07/2016          Date       ID
31/08/2016      2   29/07/2016          29/07/2016  1
30/09/2016      3   31/08/2016          29/07/2016  2
31/10/2016      4   30/09/2016          31/08/2016  1
30/11/2016      5   30/09/2016          31/08/2016  2
30/12/2016      6   30/09/2016          31/08/2016  3
31/01/2017      7   31/10/2016          30/09/2016  1
28/02/2017      8   31/10/2016          30/09/2016  2
31/03/2017                              30/09/2016  3
28/04/2017                              30/09/2016  4
31/05/2017                              30/09/2016  5
30/06/2017                              30/09/2016  6
31/07/2017                              31/10/2016  1
31/08/2017                              31/10/2016  2
29/09/2017                              31/10/2016  3
31/10/2017                              31/10/2016  4
30/11/2017                              31/10/2016  5
29/12/2017                              31/10/2016  6
31/01/2018                              31/10/2016  7
                                        31/10/2016  8

我不知道如何使用join语句,因为我只有一个参考点,ID可以与日期列表一起加入。因此,我很难让它出现在除开始日期之外的后续日期。

非常感谢

sql-server join time-series
2个回答
0
投票

没什么魔力:

SELECT DateList.Date, ObjectList.ID
FROM ObjectList 
  INNER JOIN DateList ON ObjectList.StartDate <= DateList.Date

0
投票

我在这里发布了我的答案我是如何理解你的,但不清楚为什么你的结果不包含大于2016年的日期...

我更改了语言,因为您的日期是依赖于语言的格式,我不想将它们重写为yyyymmdd

set language [British English];

declare @DateList table(dt date);
insert into @DateList values
('29/07/2016'),               
('31/08/2016'),               
('30/09/2016'),               
('31/10/2016'),               
('30/11/2016'),               
('30/12/2016'),                
('31/01/2017'),                
('28/02/2017'),               
('31/03/2017'),                              
('28/04/2017'),                              
('31/05/2017'),                              
('30/06/2017'),                              
('31/07/2017'),                              
('31/08/2017'),                              
('29/09/2017'),                              
('31/10/2017'),                              
('30/11/2017'),                              
('29/12/2017'),                              
('31/01/2018');                              

declare @obj table ( ID int,  StartDate date);
insert into @obj values
(1,   '29/07/2016'), 
(2,   '29/07/2016'), 
(3,   '31/08/2016'), 
(4,   '30/09/2016'), 
(5,   '30/09/2016'), 
(6,   '30/09/2016'),
(7,   '31/10/2016'),
(8,   '31/10/2016');

select l.*, o.id
from @DateList l join @obj o
        on l.dt >= o.StartDate
order by 1;
© www.soinside.com 2019 - 2024. All rights reserved.