SQL - 跨多个星期传播一个值

时间:2012-11-21 15:52:51

标签: sql sql-server

我目前的数据存储如下:

PERSON      DATE        RATE
----------------------------
John Smith  1/4/2012    1.2
John Smith  8/6/2012    1.7
John Smith  8/13/2012   1.9
John Smith  8/20/2012   2
John Smith  9/10/2012   1.8
John Smith  10/1/2012   3

我正在尝试输出每个人每年(每周日结束)的费率。如果某一周的费率不存在,则使用前一周,即:

PERSON      WEEK       RATE
----------------------------
John Smith  1/8/2012    1.2
John Smith  1/15/2012   1.2
John Smith  1/22/2012   1.2
John Smith  1/29/2012   1.2

我可以建立一个日期和星期组合的表格,以便我可以确定一周。我怎么能复制这个价格呢?外连接或类似的东西?

1 个答案:

答案 0 :(得分:1)

有很多我不了解你的数据,但这是一个建议。第一个子查询选择所有不同的人,第二个子查询每周匹配一次(假设您将周存储为日期,将星期日早晨00:00存储)。这假设Person是唯一的,但我希望你有一个主键可以用来确定谁是谁。

SELECT 
    X.Person,
    W.Date,
    X.Rate
FROM
(
    SELECT
        Person
    FROM
        Ratings
    GROUP BY
        Person      
) P

CROSS JOIN
(
    SELECT
         Date AS DateEnd    
    FROM
        Weeks
) W

CROSS APPLY
(   -- Last Rate before week end
    SELECT TOP 1 
        Rate
    FROM 
        Ratings
    WHERE 
        Person = P.Person AND
        Date < Dateadd(DAY,1,W.DateEnd)
    ORDER BY 
        DATE DESC
) X