繁体   English   中英

mysql,sum(a) 和 sum(a) over() 有什么区别?

[英]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

在 DB Fiddle 上查看

我们可以看到,对于每个代码,总和被折叠成一个值,我们不能在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

在 DB Fiddle 上查看

所有两个总和都附加到每一行。 你可以参考这个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM