将SQl中表中的值与进行比较
这是MyTable结构将SQl中表中的值与进行比较,sql,sql-server,tsql,Sql,Sql Server,Tsql,这是MyTable结构 MyTable : ID, Date Select ID, Date from MyTable ID Date 50 2013-01-01 00:00:00.000 51 2013-01-02 00:00:00.000 52 2013-01-02 00:00:00.000 我需要得到这样的结果 ID Date 50 2013-01-01 00:00:00.000 50 2013-01-02 00:00:00.
MyTable : ID, Date
Select ID, Date from MyTable
ID Date
50 2013-01-01 00:00:00.000
51 2013-01-02 00:00:00.000
52 2013-01-02 00:00:00.000
我需要得到这样的结果
ID Date
50 2013-01-01 00:00:00.000
50 2013-01-02 00:00:00.000
50 2013-01-03 00:00:00.000
51 2013-01-02 00:00:00.000
51 2013-01-03 00:00:00.000
52 2013-01-03 00:00:00.000
如何获得结果?似乎您想要获得日期列表。当然,您可以使用递归CTE获取日期列表:
;with data(id, date) as
(
select id, date
from mytable
union all
select id, dateadd(day, 1, date)
from data
where dateadd(day, 1, date) <= '1/3/2013'
)
select *
from data
order by id
看。这将为表中的当前日期和您提供的结束日期之间的每个ID生成日期列表。在我的示例中,是2013年1月3日似乎您想要获取日期列表。当然,您可以使用递归CTE获取日期列表:
;with data(id, date) as
(
select id, date
from mytable
union all
select id, dateadd(day, 1, date)
from data
where dateadd(day, 1, date) <= '1/3/2013'
)
select *
from data
order by id
看。这将为表中的当前日期和您提供的结束日期之间的每个ID生成日期列表。在我的例子中是2013年1月3日,我认为只有在ID列上有一个聚集索引的情况下,这会更快一些,否则BlueFoots的解决方案就太棒了
SELECT T1.ID
,Date = DATEADD(DAY, -ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY (SELECT NULL))+1, '2013-01-03')
FROM MyTable T1
JOIN MyTable T2 ON T1.ID <= T2.ID
我认为只有在ID列上有一个聚集索引的情况下,这种方法才能更快一些,否则BlueFoots的解决方案就太棒了
SELECT T1.ID
,Date = DATEADD(DAY, -ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY (SELECT NULL))+1, '2013-01-03')
FROM MyTable T1
JOIN MyTable T2 ON T1.ID <= T2.ID
为什么50有3个日期,51有2个日期,52有一个日期?最后一个日期是从哪里来的?我需要用ID和即将到来的日期添加额外的行。我的问题不是需要添加什么,而是什么逻辑决定了它。没有更多的信息是没有意义的。为什么50有3次约会,51有2次约会,52有一次约会?最后一个日期是从哪里来的?我需要用ID和即将到来的日期添加额外的行。我的问题不是需要添加什么,而是什么逻辑决定了它。没有更多的信息是没有意义的。很好的解决方案+1漂亮的蓝脚解决方案+1.