【问题标题】:SQL Server Group Results into Period Relative to DateSQL Server 将结果分组到相对于日期的期间
【发布时间】:2015-06-01 21:55:06
【问题描述】:

我希望将查询中的平均分数分组到日期的每一天。我知道您可以通过以下方式获取日期的星期等部分:

'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 是结果的中点。结果应该如下所示:

这是我目前的查询:

;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)

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

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案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]
    

    【讨论】:

    • 感谢您的输入,但它不喜欢 Cross Apply 中的 CASE 语句。请问有什么想法吗?
    • 没关系,抱歉发现它缺少SELECT!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多