0
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_col5 个以前的日历日期存储到并包括date列中的日期。例如,对于上表中的第一行,我需要5/16,5/15,5/14,5/13,5/12new_col.

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

我试图根据这两列对表进行分区,但无法找到在new_col.

请帮助您提出任何建议。

4

2 回答 2

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

于 2013-10-04T13:46:04.717 回答
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
于 2013-10-04T13:39:34.357 回答