每个现有行有5个新条目

时间:2013-10-04 13:09:30

标签: sql sql-server sql-server-2008

date,               product,   new_col,
2013/05/16,            A,
2013/05/18,            A,
2013/06/15,            A,
2013/05/16,            B,
2013/06/13,            B,
2013/06/20,            B

我正在使用SQL Server 2008。

对于每个现有条目,在new_col我需要存储到new_col 5个之前的日历日期,直至date列中的日期。例如。对于上表中的第一行,我需要5/16,5/15,5/14,5/13,5/12中的new_col

表格中有很多产品,每种产品都有很多日期。

我尝试根据这两列对表进行分区,但无法找到在new_col中输入5天的方法。

请提供任何建议。

2 个答案:

答案 0 :(得分:1)

WITH cal AS (
    SELECT CAST('20130101' AS DATE) as cal_date
    UNION ALL
    SELECT DATEADD(day, 1, cal_date)
    FROm cal 
    WHERE cal_date < CAST('20131231' AS DATE )
)
SELECT 
  [date],[product],
   new_col = STUFF((SELECT ',' + CONVERT(VARCHAR(10),cal.cal_date,111) 
              FROM cal 
              WHERE cal.cal_date BETWEEN DATEADD(day, -4, tbl.[date]) AND tbl.[date]
              ORDER BY cal.cal_date DESC      
              FOR XML PATH('')    
              ),1,1,'')
FROM tbl
OPTION (maxrecursion 0)

sql fiddle demo

答案 1 :(得分:0)

我不知道这是否是最佳解决方案,但它是第一个突然出现在我脑海中的解决方案。同样正如人们提到的那样,您不需要存储它......您可以直接从您部署的任何报告解决方案中调用此函数。删除最后一个逗号很懒,但这很简单。您也可以根据需要随意调整日期时间格式。

CREATE TABLE dbo.Sam ([Date] DATE, Product VARCHAR(10), NewCol VARCHAR(1000))
INSERT INTO dbo.Sam
SELECT '2013/05/16','A',NULL
UNION ALL SELECT '2013/05/18','A',NULL
UNION ALL SELECT '2013/06/15','A',NULL
UNION ALL SELECT '2013/05/16','B',NULL
UNION ALL SELECT '2013/06/13','B',NULL
UNION ALL SELECT '2013/06/20','B',NULL

GO


CREATE FUNCTION dbo.fnGet4PreviousDates(@Date DATE, @Product VARCHAR(10))
    RETURNS VARCHAR(1000)
AS
BEGIN

    DECLARE @Out VARCHAR(1000) = ''


    SELECT @Out = @Out + CONVERT(VARCHAR,[Date],112) + ','
    FROM (
        SELECT TOP 5 [Date]
        FROM dbo.Sam
        WHERE Product = @Product
        AND [Date] < @Date
        ORDER BY [Date] DESC
    ) t

    RETURN @Out

END
GO

UPDATE dbo.Sam
SET NewCol = dbo.fnGet4PreviousDates([Date],Product)

SELECT * FROM dbo.Sam