每第 n 组求和 SQL 行
Sum SQL rows on every nth and group
我的数据如下:
QUARTER_CMT DEPT SALES
7 A 39
8 A 23
9 A 33
10 A 45
11 A 50
12 A 110
1 B 44
2 B 56
3 B 87
4 B 22
我的目标是在 DEPT
之前每 4 个季度获得总数 SALES
,并保留 Quarter_CNT
个数字作为汇总。
QUARTER_CMT DEPT SALES_TOT
7 A 140
11 A 160
1 B 209
正在进行的代码。我想对总计进行分组并加入最新的 QUARTER_CMT
以获得一行 DEPT
:
SELECT
ROW_NUMBER() OVER(PARTITION BY DEPTORDER BY QUARTER_CMT) as RN,
QUARTER_CMT,
DEPT,
--RANK() OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRankOrg,
--NTILE(4) OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRank,
SALES
FROM TABLE_1
ORDER BY DEPT, QUARTER_CMT
您需要将 row_number 除以 5 以确定周期
SELECT MIN (QUARTER_CMT) QUARTER_CMT, DEPT, SUM(SALES) SALES, PART
FROM (
SELECT *, FLOOR(ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY QUARTER_CMT) / 5) AS PART
FROM TABLE_1
) AS T
GROUP BY DEPT, PART
ORDER BY DEPT, PART
结果:
QUARTER_CMT DEPT SALES PART
----------- ---- ----------- -----------
7 A 140 0
11 A 160 1
1 B 209 0
试试这个:
with a as (
select
row_number() over(partition by dept order by quarter_cmt)-1 n,
quarter_cmt, dept, sales
from t
order by dept, quarter_cmt
)
select min(quarter_cmt) quarter_cmt, dept, sum(sales) sales_tot
from a
group by dept, floor(n/4)
order by dept, quarter_cmt
;
假设此示例数据:
create or replace table t as
select QUARTER_CMT, DEPT, SALES from values
(7,'A',39),
(8,'A',23),
(9,'A',33),
(10,'A',45),
(11,'A',50),
(12,'A',110),
(1,'B',44),
(2,'B',56),
(3,'B',87),
(4,'B',22)
;
我的数据如下:
QUARTER_CMT DEPT SALES 7 A 39 8 A 23 9 A 33 10 A 45 11 A 50 12 A 110 1 B 44 2 B 56 3 B 87 4 B 22
我的目标是在 DEPT
之前每 4 个季度获得总数 SALES
,并保留 Quarter_CNT
个数字作为汇总。
QUARTER_CMT DEPT SALES_TOT 7 A 140 11 A 160 1 B 209
正在进行的代码。我想对总计进行分组并加入最新的 QUARTER_CMT
以获得一行 DEPT
:
SELECT ROW_NUMBER() OVER(PARTITION BY DEPTORDER BY QUARTER_CMT) as RN, QUARTER_CMT, DEPT, --RANK() OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRankOrg, --NTILE(4) OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRank, SALES FROM TABLE_1 ORDER BY DEPT, QUARTER_CMT
您需要将 row_number 除以 5 以确定周期
SELECT MIN (QUARTER_CMT) QUARTER_CMT, DEPT, SUM(SALES) SALES, PART
FROM (
SELECT *, FLOOR(ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY QUARTER_CMT) / 5) AS PART
FROM TABLE_1
) AS T
GROUP BY DEPT, PART
ORDER BY DEPT, PART
结果:
QUARTER_CMT DEPT SALES PART
----------- ---- ----------- -----------
7 A 140 0
11 A 160 1
1 B 209 0
试试这个:
with a as (
select
row_number() over(partition by dept order by quarter_cmt)-1 n,
quarter_cmt, dept, sales
from t
order by dept, quarter_cmt
)
select min(quarter_cmt) quarter_cmt, dept, sum(sales) sales_tot
from a
group by dept, floor(n/4)
order by dept, quarter_cmt
;
假设此示例数据:
create or replace table t as
select QUARTER_CMT, DEPT, SALES from values
(7,'A',39),
(8,'A',23),
(9,'A',33),
(10,'A',45),
(11,'A',50),
(12,'A',110),
(1,'B',44),
(2,'B',56),
(3,'B',87),
(4,'B',22)
;