我需要总结过去7天的值,所以它应该是当前加上前一个6.这应该发生在每一行,即在每一行中,列值将是当前的+前一个6。 案例: -
(注意: - 我将通过计算秒数来计算小时数。)
我尝试使用以下查询: -
选择SUM([drivingTime])OVER(PARTITION BY驱动程序ORDER BY日期前6行与当前行) 来自[f.DriverHseCan]
我面临的问题是我必须对驱动程序进行分组,资产为日期
在上述情况下,应该起动驾驶时间,然后应该采取前6行, 我不能使用rank()这样做,因为我需要这些行以及我必须在报告中显示它。
我尝试在SSRS和SQL中执行此操作。
简而言之,它增加了当前前6天的总驾驶时间
答案 0 :(得分:1)
尝试以下查询
SELECT
s.date
, s.driverid
, s.assetid
, s.drivingtime
, SUM(s2.drivingtime) AS total_drivingtime
FROM f.DriverHseCan s
JOIN (
SELECT date,driverid, SUM(drivingtime) drivingtime
FROM f.DriverHseCan
GROUP BY date,driverid
) AS s2
ON s.driverid = s2.driverid AND s2.date BETWEEN DATEADD(d,-6,s.date) AND s.date
GROUP BY
s.date
, s.driverid
, s.assetid
, s.drivingtime
如果您有周开始/结束日期,可能会有更好的替代方案来解决您的问题,例如:使用SSRS表达式中的周数而不是在SQL服务器上进行自联接
答案 1 :(得分:0)
我认为聚合可以满足您的需求:
select sum(sum([drivingTime])) over (partition by driverid
order by date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
)
from [f.DriverHseCan]
group by driverid, date
答案 2 :(得分:0)
我猜您需要使用CROSS APPLY
。
喜欢以下内容? :
SELECT driverID,
date,
CA.Last6DayDrivingTime
FROM YourTable YT
CROSS APPLY
(
SELECT SUM(drivingTime) AS Last6DayDrivingTime
FROM YourTable CA ON CA.driverID=YT.driverID
WHERE CA.date BETWEEN DATEADD(DAY,-6,YT.date) AND YT.date)
) CA
编辑: 当您评论交叉应用会降低性能时,其他选项是预先计算临时表中的周值或使用CTE,然后在主查询中使用它们。