SQL Server组结果相对于日期的期间

时间:2015-06-01 13:30:27

标签: sql sql-server group-by

我希望将查询中的平均分数分组到日期的每一天。我知道你可以通过以下方式获得一周中的某一天等等。

'Week ' + CAST(DATEPART(wk, s.date_taken) AS (varchar(2)) Week

这不是我所追求的。我在加入期间过滤我的结果,以获得特定日期前四周和四周后的结果:

INNER JOIN
    swa_speeding AS s
    ON i.policy_id = s.policy_id
    AND s.date_taken BETWEEN DATEADD(WEEK,-4,i.note_date) AND DATEADD(WEEK,4,i.note_date)

问题在于,每条记录上的表格swa_speedingi.note_date都会加入大量数据。

实际上,我要求帮助的是将所有结果分组到平均来自相对于i.note_date并且i.note_date为结果中点的平均值的那一天。结果应该是看起来像:

Example

到目前为止我的查询:

;SELECT
    datepart(day, s.date_taken) [Day],
    AVG(s.dlyspeed)

FROM
    swa_intervention AS i

INNER JOIN
    swa_speeding AS s
    ON i.policy_id = s.policy_id
    AND s.date_taken BETWEEN DATEADD(WEEK,-4,i.note_date) AND DATEADD(WEEK,4,i.note_date)

INNER JOIN
    swa_policy AS p
    ON i.policy_id = p.id

WHERE
    i.id = 431

GROUP BY
    datepart(day, s.date_taken)

希望这对我想要实现的目标有意义吗?

1 个答案:

答案 0 :(得分:1)

添加新字段到组,如下所示。

SELECT
    [GroupName],
    AVG(s.dlyspeed)

FROM
    swa_intervention AS i

INNER JOIN
    swa_speeding AS s
    ON i.policy_id = s.policy_id
    AND s.date_taken BETWEEN DATEADD(WEEK,-4,i.note_date) AND DATEADD(WEEK,4,i.note_date)

INNER JOIN
    swa_policy AS p
    ON i.policy_id = p.id

CROSS APPLY (SELECT CASE WHEN s.date_taken > i.note_date THEN 'After' 
                    WHEN s.date_taken = i.note_date THEN 'On'
                    WHEN s.date_taken < i.note_date THEN 'Before'
            END [GroupName]
) a

WHERE               
    i.id = 431

GROUP BY
    [GroupName]