SQL选择:获取列中的上一个日期

时间:2017-10-26 11:46:00

标签: sql sql-server tsql

我的SQL服务器中有一个表有一些日期。现在我想创建一个Select,它给我一个包含所有日期的列,然后是第二列,其中包含第一列的先前日期,第三列包含前一个日期列的前一个日期(c2)。 对于例子:

  c1(orginal)          c2(prevoius of c1)    c3(previous of c2)
2017-10-15 00:00:00   2017-04-15 00:00:00   2016-10-15 00:00:00
2017-04-15 00:00:00   2016-10-15 00:00:00   2016-04-15 00:00:00
2016-10-15 00:00:00   2016-04-15 00:00:00   2015-10-15 00:00:00
2016-04-15 00:00:00   2015-10-15 00:00:00           null
2015-10-15 00:00:00           null                  null

颜色示例: exemple2.0

是否可以进行SELECT,其中第一行是第1列的第一个日期,第二行是第1列,第3行是第1列。第二行是第1列,第3行是列,第3行是第3列1和第1列中的第四个。

我当前的查询

SELECT DISTINCT(BFSSTudStichdatum) AS C1, BFSSTudStichdatum AS C2, 
BFSSTudStichdatum AS C3  FROM BFSStudierende
ORDER BY C1 DESC

结果:

4 个答案:

答案 0 :(得分:1)

您在寻找auto test = Foo( {1, 'a'}, {2, 'b'} ); 吗?

Foo::MyStruct a1 = {1, 'a'};
Foo::MyStruct b2 = {2, 'b'};

auto test = Foo(a1, b2);

答案 1 :(得分:1)

由于您需要先获得distinct日期列表,因此您需要将查询拆分为公用表格表达式,然后使用lag获取c2和{ {1}}值:

c3

输出:

declare @t table(c1 datetime);
insert into @t values ('2017-10-15 00:00:00'),('2017-04-15 00:00:00'),('2016-10-15 00:00:00'),('2016-04-15 00:00:00'),('2015-10-15 00:00:00')
                     ,('2017-10-15 00:00:00'),('2017-04-15 00:00:00'),('2016-10-15 00:00:00'),('2016-04-15 00:00:00'),('2015-10-15 00:00:00');

with c as
(
    select distinct c1
    from @t
)
select c1
      ,lag(c1, 1) over (order by c1) as c2
      ,lag(c1, 2) over (order by c1) as c3
from c
order by c1 desc;

答案 2 :(得分:0)

对于SQL Server 2008及更高版本:

WITH DataSource AS
(
    SELECT DISTINCT *
          ,DENSE_RANK() OVER (ORDER BY c1) rowID
    FROM @t
)
SELECT DS1.[c1]
      ,DS2.[c1]
      ,DS3.[c1]
FROM DataSource DS1
LEFT JOIN DataSource DS2
    ON DS1.[rowID] = DS2.[rowID] + 1
LEFT JOIN DataSource DS3
    ON DS1.[rowID] = DS3.[rowID] + 2;

答案 3 :(得分:0)

对于SQL Server 2008及更高版本:

希望你确实想要一个自动列生成,其中一个值落后于过去的列第一个值。请尝试以下代码段。

根据数据集中的列数创建动态查询。

create table BFSStudierende
(
BFSSTudStichdatum  datetime
)
insert into BFSStudierende
Select getdate()
union
Select dateadd(day,1,getdate())
union
Select dateadd(day,2,getdate())
union
Select dateadd(day,3,getdate())
union
Select dateadd(day,4,getdate())

Declare @count int=(Select count(BFSSTudStichdatum ) from BFSStudierende)

Declare @query nvarchar(max)='with BFSStudierendeCte as (Select *,row_number() over(order by BFSSTudStichdatum)rn  from BFSStudierende)  Select *from BFSStudierendeCte as BFSStudierendeCte1'

Declare  @i int=2 ;
Declare  @j int ;

while(@i<=@count)
begin
Set @j=@i-1
Set @query=@query+' left outer join BFSStudierendeCte as BFSStudierendeCte'+cast(@i as varchar(5)) +' on BFSStudierendeCte1.rn+'+cast(@j as varchar(5))+'=BFSStudierendeCte'+cast(@i as varchar(5))+'.rn';
set @i+=1;
End
print @query
Execute(@query)

注意:不会从结果中删除重复日期。如果您需要删除重复。请更改以上代码段中的以下行。

Declare @count int=(Select count(distinct BFSSTudStichdatum ) from BFSStudierende)

Declare @query nvarchar(max)='with BFSStudierendeCte as (Select *,row_number() over(order by BFSSTudStichdatum)rn from(Select distinct BFSSTudStichdatum from BFSStudierende)l   )  Select *from BFSStudierendeCte as BFSStudierendeCte1'