Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 Server将以前的值插入到新列中_Sql_Sql Server - Fatal编程技术网

SQL Server将以前的值插入到新列中

SQL Server将以前的值插入到新列中,sql,sql-server,Sql,Sql Server,我有两张桌子: 表1: 客户名称账单日期 CITY - BEAUTIFICATION LM 2013-05-30 00:00:00.000 CITY - BEAUTIFICATION LM 2013-06-28 00:00:00.000 CITY - PARKS/RT 66 2012-07-12 00:00:00.000 CITY - PARKS/RT 66 2012-07-12 00

我有两张桌子:

表1: 客户名称账单日期

CITY - BEAUTIFICATION LM            2013-05-30 00:00:00.000
CITY - BEAUTIFICATION LM            2013-06-28 00:00:00.000
CITY - PARKS/RT 66                  2012-07-12 00:00:00.000
CITY - PARKS/RT 66                  2012-07-12 00:00:00.000
等等

表2有一个字段:CycleStartDate

我想将表1中的数据插入到表2中,如下所示: 对于每个唯一的customerName,CycleStartDate是上一条记录中的BillDate。如果以前的记录不存在,则将空值替换为2013-07-1 00:00:00.000


我们是否有可能做到这一点?

好吧,假设SQL Server 2005+,这里有一种方法:

;WITH CTE AS
(
    SELECT  CustomerName,
            BillDate,
            RN1=ROW_NUMBER() OVER(PARTITION BY CustomerName ORDER BY BillDate),
            RN2=ROW_NUMBER() OVER(PARTITION BY CustomerName ORDER BY BillDate DESC)
    FROM dbo.Table1
)
INSERT INTO dbo.Table2(CustomerName, CycleStartDate)
SELECT  CustomerName,
        CASE WHEN RN2 = 1 THEN '20130701' ELSE CycleStartDate END
FROM CTE
WHERE RN1 = 1

如果SQL Server少于2012,请尝试以下操作

select T.CustomerName, isnull(TP.BillDate, '20130701') as CycleStartDate
from Table1 as T
   outer apply (
       select top 1 T2.BillDate
       from Table1 as T2
       where T2.CustomerName = T.CustomerName and T2.BillDate < T.BillDate
       order by T2.BillDate desc
   ) as TP

如果您有SQL Server 2012,请参见函数

您所说的上一条记录中的账单日期是什么意思?您是否试图说,如果客户有两个日期,则应选择较小的日期?例如,如果是客户城市-美化LM CyclestartDate应为2013-05-30 00:00:00.000似乎是:的副本应修改原件,而不是再次发布。