2016-05-12 107 views
3

我有一个像如下表 - SQL Server 2008中新行在SQL Server计算列2008

我想创建一个称为NEW_DATE

具体FINDID柱更

的第一个记录的新日期将是-1秒第二少的纪录FROM_DATE的等等... ..

行与FROM_DATE升序 新的日期排序其中确定= 1始终保持'12 /9999分之3112:00:00 AM

DDL:

CREATE TABLE MYTABLE 
(
FINDID INT, 
SUPPLIERID INT , 
SUPPLIERSKU VARCHAR (35), 
PRICE decimal (14,4), 
FROM_DATE datetime , 
IDENTIFY bit 
) 

INSERT MYTABLE 

SELECT 1000001, 1001, '012RE0020', 4, '5/12/2016 6:49:40 AM', 0 UNION ALL 
SELECT 1000001, 1001, '012RE0020', 4, '5/12/2016 7:16:24 AM', 0 UNION ALL 
SELECT 1000001, 1001, '012RE0020', 5, '5/12/2016 7:52:55 AM', 1 UNION ALL 
SELECT 1000002, 1001, '101ME0320', 21, '5/12/2016 6:49:40 AM', 0 UNION ALL 
SELECT 1000002, 1001, '101ME0320', 21, '5/12/2016 7:16:24 AM', 0 UNION ALL 
SELECT 1000002, 1001, '101ME0320', 26, '5/12/2016 7:33:38 AM', 0 UNION ALL 
SELECT 1000002, 1001, '101ME0320', 27, '5/12/2016 7:52:55 AM', 1 

输出看起来像

FINDID SUPPLIERID SUPPLIERSKU PRICE FROM_DATE NEW_TO_DATE IDENTIFY 
1000001 1001 012RE0020 4 5/12/2016 6:49:40 AM 5/12/2016 7:16:23 AM 0 
1000001 1001 012RE0020 4 5/12/2016 7:16:24 AM 5/12/2016 7:52:54 AM 0 
1000001 1001 012RE0020 5 5/12/2016 7:52:55 AM 12/31/9999 12:00:00 AM 1 
1000002 1001 101ME0320 21 5/12/2016 6:49:40 AM 5/12/2016 7:16:23 AM 0 
1000002 1001 101ME0320 21 5/12/2016 7:16:24 AM 5/12/2016 7:33:37 AM 0 
1000002 1001 101ME0320 26 5/12/2016 7:33:38 AM 5/12/2016 7:52:54 AM 0 
1000002 1001 101ME0320 27 5/12/2016 7:52:55 AM 12/31/9999 12:00:00 AM 1 

任何人都可以请帮助我如果可能在sql

回答

1

我建议你创建这样一个观点:

CREATE VIEW dbo.MyView 
AS 
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY FINDID ORDER BY FINDID, FROM_DATE) as RN 
FROM MYTABLE m 
) 

SELECT c.FINDID, 
     c.SUPPLIERID, 
     c.SUPPLIERSKU, 
     c.PRICE, 
     c.FROM_DATE, 
     ISNULL(DATEADD(second,-1,c2.FROM_DATE),'12/31/9999 12:00:00 AM') as NEW_TO_DATE, 
     c.IDENTIFY 
FROM cte c 
LEFT JOIN cte c2 
    ON c2.RN = c.RN + 1 AND c.FINDID = c2.FINDID; 
GO 

输出:

FINDID SUPPLIERID SUPPLIERSKU PRICE FROM_DATE    NEW_TO_DATE    IDENTIFY 
1000001 1001  012RE0020 4.0000 2016-05-12 06:49:40.000 2016-05-12 07:16:23.000 0 
1000001 1001  012RE0020 4.0000 2016-05-12 07:16:24.000 2016-05-12 07:52:54.000 0 
1000001 1001  012RE0020 5.0000 2016-05-12 07:52:55.000 9999-12-31 00:00:00.000 1 
1000002 1001  101ME0320 21.0000 2016-05-12 06:49:40.000 2016-05-12 07:16:23.000 0 
1000002 1001  101ME0320 21.0000 2016-05-12 07:16:24.000 2016-05-12 07:33:37.000 0 
1000002 1001  101ME0320 26.0000 2016-05-12 07:33:38.000 2016-05-12 07:52:54.000 0 
1000002 1001  101ME0320 27.0000 2016-05-12 07:52:55.000 9999-12-31 00:00:00.000 1 
+0

非常感谢.. ........ :) –

+0

我的荣幸! :) – gofr1

1

在SQL Server 2012+中,您只需使用lead()。在SQL Server 2008中,您可以使用相关子查询或outer apply做到这一点:

select t.*, 
     coalesce(t2.from_date, '9999-12-31') as new_to_date 
from mytable t outer apply 
    (select top 1 t2.* 
     from mytable t2 
     where t2.findid = t.findid and t2.from_date > t.from_date 
    ) t2; 
+0

感谢。 ..非常接近,但它应该比第二条记录的FROM_DATE小1秒,等等...... –

+0

我在尝试类似第1行的内容new_date =第2行fromdate- 1 第2行new_dat e =第三行fromdate-1 ....等等,对于一个特定的findid –

+2

只需用'DATEADD(SECOND,-1,t2.from_date)替换外部应用中的t2。* as from_date' –