让我们看一下如下所示的创建表
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');
我们想要按照 trans_type
对 quantity
进行求和:
查询 #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;
我们将得到这个表:
交易日期 |
股票代码 |
交易类型 |
数量 |
净数量 |
2020年12月10日 00:00:00 |
FB |
买入 |
100 |
130 |
2020年12月28日 00:00:00 |
FB |
买入 |
50 |
130 |
2020年12月29日 00:00:00 |
FB |
卖出 |
80 |
130 |
2020年12月30日 00:00:00 |
FB |
卖出 |
30 |
130 |
2020年12月31日 00:00:00 |
FB |
买入 |
40 |
130 |
2020年11月16日 00:00:00 |
AAPL |
买入 |
30 |
130 |
2020年11月17日 00:00:00 |
AAPL |
卖出 |
70 |
130 |
2020年11月20日 00:00:00 |
AAPL |
买入 |
50 |
130 |
2020年11月24日 00:00:00 |
AAPL |
买入 |
40 |
130 |
在DB Fiddle上查看
本文将帮助您学习窗口函数:SQL窗口函数简介。
参考资料:
带有case的MySQL窗口函数
sum(column) over ()
- user330315()
,你可以随时使用(partition by NULL)
。 - Marmite Bomber