窗函数:如何无为分区?



我正在提取一个表,但我也想要一个列的和。

我可以说SUM(column) over (partition by other_column)

对于other_column给出的每个组,得到column上的和的新列。

但是我不想分组!基本上,sum(column)意味着给我一个具有恒定行的列,等于整个column的和,没有分区。

那么如何在零上进行分区呢?

就像你说的那样;在"nothing"例如:

SQL> select deptno, ename, sal, sum(sal) over () sumsal
2  from emp;
DEPTNO ENAME             SAL     SUMSAL
---------- ---------- ---------- ----------
20 SMITH             920      34145
30 ALLEN            1600      34145
30 WARD             1250      34145
20 JONES            2975      34145
30 MARTIN           1250      34145
30 BLAKE            2850      34145
10 CLARK            2450      34145
20 SCOTT            3000      34145
10 KING            10000      34145
30 TURNER           1500      34145
20 ADAMS            1100      34145
30 JAMES             950      34145
20 FORD             3000      34145
10 MILLER           1300      34145
14 rows selected.
SQL>

让我们看看表orders创建如下:

Schema (MySQL v8.0)
CREATE TABLE orders (
`trade_date` DATETIME,
`ticker` VARCHAR(4),
`trans_type` VARCHAR(4),
`quantity` INTEGER
);
INSERT INTO orders
(`trade_date`, `ticker`, `trans_type`, `quantity`)
VALUES
('2020-12-10', 'FB', 'BUY', '100'),
('2020-12-28', 'FB', 'BUY', '50'),
('2020-12-29', 'FB', 'SELL', '80'),
('2020-12-30', 'FB', 'SELL', '30'),
('2020-12-31', 'FB', 'BUY', '40'),
('2020-11-16', 'AAPL', 'BUY', '30'),
('2020-11-17', 'AAPL', 'SELL', '70'),
('2020-11-20', 'AAPL', 'BUY', '50'),
('2020-11-24', 'AAPL', 'BUY', '40');

我们想用trans_typequantity求和:

查询# 1

SELECT
trade_date,
ticker,
trans_type,
quantity,
SUM(CASE WHEN trans_type='SELL' THEN -quantity ELSE quantity END) OVER () AS net_quantity
FROM
orders;

我们将得到这张表:

trade_datetbody> <<tr>
tickertrans_typequantitynet_quantity
2020-12-10就是FB100130
2020-12-28就是FB50130
2020-12-29就是FB销售80130
2020-12-30就是FB销售30130
2020-12-31就是FB40130
2020-11-16就是apple30130
2020-11-17就是apple销售70130
2020-11-20就是apple50130
2020-11-24就是apple40130

最新更新