窗口函数:如何分区?
Posted
技术标签:
【中文标题】窗口函数:如何分区?【英文标题】:Window functions: How to partition over nothing? 【发布时间】:2021-01-19 12:56:13 【问题描述】:我正在提取一个表,但我也想要一列的总和。
我可以说SUM(column) over (partition by other_column)
为other_column
给出的每个分组获取一个总和超过column
的新列。
但我不想要分组!基本上sum(column)
是为了给我一个恒定行等于整个column
总和的列,没有分区。
那么我该如何分区呢?
【问题讨论】:
sum(column) over ()
如果你害怕()
,你可能总是(partition by NULL)
【参考方案1】:
就像你说的那样;超过“无”。例如:
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>
【讨论】:
【参考方案2】:我们看看orders
创建的表如下:
架构 (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');
我们想将quantity
与trans_type
相加:
查询 #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_date | ticker | trans_type | quantity | net_quantity |
---|---|---|---|---|
2020-12-10 00:00:00 | FB | BUY | 100 | 130 |
2020-12-28 00:00:00 | FB | BUY | 50 | 130 |
2020-12-29 00:00:00 | FB | SELL | 80 | 130 |
2020-12-30 00:00:00 | FB | SELL | 30 | 130 |
2020-12-31 00:00:00 | FB | BUY | 40 | 130 |
2020-11-16 00:00:00 | AAPL | BUY | 30 | 130 |
2020-11-17 00:00:00 | AAPL | SELL | 70 | 130 |
2020-11-20 00:00:00 | AAPL | BUY | 50 | 130 |
2020-11-24 00:00:00 | AAPL | BUY | 40 | 130 |
View on DB Fiddle
这篇文章对你学习窗口函数有帮助:An Intro to SQL Window Functions。
参考:mysql window function with case
【讨论】:
以上是关于窗口函数:如何分区?的主要内容,如果未能解决你的问题,请参考以下文章