SQL 服务器组结果进入相对于日期的期间
SQL Server Group Results into Period Relative to Date
我希望将查询的平均分数分组到日期的每一天。我知道您可以通过以下方式获取星期几等日期的一部分:
'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)
问题是每个记录上的 table swa_speeding
和 i.note_date
更改中加入了大量数据。
实际上,我要寻求帮助的是将所有结果分组到平均值相对于 i.note_date
的那一天,其中 i.note_date
是 [=33] 的中点=] 结果应如下所示:
到目前为止,这是我的查询:
;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)
希望这对我想要实现的目标有意义吗?
添加一个新字段作为分组依据,如下所示。
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]
我希望将查询的平均分数分组到日期的每一天。我知道您可以通过以下方式获取星期几等日期的一部分:
'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)
问题是每个记录上的 table swa_speeding
和 i.note_date
更改中加入了大量数据。
实际上,我要寻求帮助的是将所有结果分组到平均值相对于 i.note_date
的那一天,其中 i.note_date
是 [=33] 的中点=] 结果应如下所示:
到目前为止,这是我的查询:
;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)
希望这对我想要实现的目标有意义吗?
添加一个新字段作为分组依据,如下所示。
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]