Sql 通过不工作使用over和partition获取累积和
我试图获得记录的累计总和,直到两列的值发生变化。下面是我现在掌握的数据样本Sql 通过不工作使用over和partition获取累积和,sql,sql-server,Sql,Sql Server,我试图获得记录的累计总和,直到两列的值发生变化。下面是我现在掌握的数据样本 DT缩写为航次缩写为船舶 2017-05-08 16:00:00.000 0001W rmhp tmvpn 2017-05-08 16:00:00.000 0001W rmhp tmvpn 2017-05-09 20:00:00.000 0001W rmhp tmvpn 2017-05-08 16:00:00.000 0002W rmhp hueml 2017-05-08 16:00:00.000 0002W rmhp
DT缩写为航次缩写为船舶
2017-05-08 16:00:00.000 0001W rmhp tmvpn
2017-05-08 16:00:00.000 0001W rmhp tmvpn
2017-05-09 20:00:00.000 0001W rmhp tmvpn
2017-05-08 16:00:00.000 0002W rmhp hueml
2017-05-08 16:00:00.000 0002W rmhp hueml
2017-05-09 20:00:00.000 0002W rmhp hueml
ETB_DT_记录的数量
2017-05-10 12:00:00.000 17
2017-05-10 12:00:00.000 17
2017-05-10 12:00:00.000 10
2017-05-26 14:30:00.000 10
2017-05-26 14:30:00.000 10
2017-05-26 14:30:00.000 10
我在我的系统上做了一些与订单类似的事情
我认为您需要查看“无界前一行和当前行之间的行”
这是我对订单的查询,希望它能帮助您整理订单
SELECT
SaleMonth, Month_Order_Count, MonthTotal,
SUM(Month_Order_Count) OVER(ORDER BY SaleMonth **ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW**) AS Cumulative_Order_Count,
SUM(MonthTotal) OVER(ORDER BY SaleMonth **ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW**) AS Cumulative_Order_Value
FROM
(
SELECT SUB_Q.SaleMonth, Count( DISTINCT SUB_Q.OrderID) as Month_Order_Count, SUM(Value) as MonthTotal FROM
(
SELECT CONCAT( DatePart( year, OH.OrderDate), '-', FORMAT( OH.OrderDate, 'MM')) as SaleMonth,
OI.OrderID,
OI.Value
FROM ORDERHEADER OH
INNER JOIN OrderItem OI ON OI.OrderID = OH.OrderID
INNER JOIN ECodeOrder ECO ON ECO.OrderId = OH.ORDERID
) SUB_Q
GROUP BY SUB_Q.SaleMonth
)TOTALS_Q
ORDER BY SaleMonth
<>你可以简单地在开始时添加一个CTE,以便考虑分区必须执行的顺序:
DECLARE @t TABLE(
Dt DATETIME
,ABBR_VOYAGE_OUT_N NVARCHAR(20)
,ABBR_VESSEL_M NVARCHAR(20)
,ETB_DT DATETIME
,No_of_records INT
)
INSERT INTO @t VALUES('2017-05-08 16:00:00.000', '0001W', 'rmhp tmvpn', '2017-05-10 12:00:00.000', 17);
INSERT INTO @t VALUES('2017-05-08 16:00:00.000', '0001W', 'rmhp tmvpn', '2017-05-10 12:00:00.000', 17);
INSERT INTO @t VALUES('2017-05-09 20:00:00.000', '0001W', 'rmhp tmvpn', '2017-05-10 12:00:00.000', 10);
INSERT INTO @t VALUES('2017-05-08 16:00:00.000', '0002W', 'rmhp hueml', '2017-05-26 14:30:00.000', 10);
INSERT INTO @t VALUES('2017-05-08 16:00:00.000', '0002W', 'rmhp hueml', '2017-05-26 14:30:00.000', 10);
INSERT INTO @t VALUES('2017-05-09 20:00:00.000', '0002W', 'rmhp hueml', '2017-05-26 14:30:00.000', 10);
WITH cte AS(
SELECT DT, ABBR_VOYAGE_OUT_N, ABBR_VESSEL_M,ETB_DT,No_of_records, ROW_NUMBER() OVER (ORDER BY DT, ETB_DT) AS rn
FROM @t
)
select DT, ABBR_VOYAGE_OUT_N, ABBR_VESSEL_M,ETB_DT,No_of_records,
sum(No_of_records) over (partition by ABBR_VOYAGE_OUT_N, ABBR_VESSEL_M ORDER BY rn) as cumulative
from cte
order by ABBR_VOYAGE_OUT_N,ABBR_VESSEL_M
非常感谢这对我的帮助!