[英]In mysql, What is the difference between sum(a) and sum(a) over()?
我以为他们两个都是用来把所有的数字加起来的。 但是我的代码只能通过使用 sum(a) over() 才能被接受。
select avg(1.0*Number) median
from (
select *, sum(Frequency) over(order by Number) pos,
(sum(Frequency) over())/2.0 mid
from Numbers
) A
where mid between pos-Frequency and pos
从这份文件中我们可以了解到:
SQL SUM function 用于返回 SELECT 语句中表达式的总和。
总和在多行上返回一个值,因此我们应该清楚我们是想将该标量放在所有这些行中还是一行中。 如果我们想把它放在所有这些行中,我们可以使用window functions
(分区),否则我们可以使用group by
(聚合)。
我们创建一个表如下:
架构 (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');
让我们先使用group by
完成。
查询#1
SELECT
ticker, SUM(CASE WHEN trans_type='SELL' THEN -quantity ELSE quantity END) AS net_quantity
FROM
orders
group by ticker;
自动收报机 | 净数量 |
---|---|
面子书 | 80 |
美国航空航天局 | 50 |
我们可以看到,对于每个代码,总和被折叠成一个值,我们不能在select
子句中添加其他字段。
来看看分区方法:
查询 #2
SELECT
trade_date,
ticker,
trans_type,
quantity,
SUM(CASE WHEN trans_type='SELL' THEN -quantity ELSE quantity END) OVER (partition by ticker) AS net_quantity
FROM
orders;
交易日期 | 自动收报机 | trans_type | 数量 | 净数量 |
---|---|---|---|---|
2020-11-16 00:00:00 | 美国航空航天局 | 买 | 30 | 50 |
2020-11-17 00:00:00 | 美国航空航天局 | 卖 | 70 | 50 |
2020-11-20 00:00:00 | 美国航空航天局 | 买 | 50 | 50 |
2020-11-24 00:00:00 | 美国航空航天局 | 买 | 40 | 50 |
2020-12-10 00:00:00 | 面子书 | 买 | 100 | 80 |
2020-12-28 00:00:00 | 面子书 | 买 | 50 | 80 |
2020-12-29 00:00:00 | 面子书 | 卖 | 80 | 80 |
2020-12-30 00:00:00 | 面子书 | 卖 | 30 | 80 |
2020-12-31 00:00:00 | 面子书 | 买 | 40 | 80 |
所有两个总和都附加到每一行。 你可以参考这个答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.