Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQl中表中的值与进行比较_Sql_Sql Server_Tsql - Fatal编程技术网

将SQl中表中的值与进行比较

将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结构

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.