获取前6个值的总和,包括该组

时间:2017-07-12 03:16:27

标签: sql sql-server reporting-services ssrs-2008

我需要总结过去7天的值,所以它应该是当前加上前一个6.这应该发生在每一行,即在每一行中,列值将是当前的+前一个6。 案例: -

The requested scenario

(注意: - 我将通过计算秒数来计算小时数。)

我尝试使用以下查询: -

选择SUM([drivingTime])OVER(PARTITION BY驱动程序ORDER BY日期前6行与当前行)   来自[f.DriverHseCan]

我面临的问题是我必须对驱动程序进行分组,资产为日期

scenario

在上述情况下,应该起动驾驶时间,然后应该采取前6行, 我不能使用rank()这样做,因为我需要这些行以及我必须在报告中显示它。

我尝试在SSRS和SQL中执行此操作。

简而言之,它增加了当前前6天的总驾驶时间

3 个答案:

答案 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,然后在主查询中使用它们。