窗口函数:如何在没有分区的情况下进行分区?

3
我正在提取一个表格,但我也想要一列的总和。
我可以使用 SUM(column) over (partition by other_column) 来得到一个新的列,其中对于由 other_column 给出的每个分组,都可以获得 column 的总和。
但我不想进行分组!基本上,sum(column) 旨在给我一个具有常数行的列,其行等于整个 column 的总和,而没有分区。
那么,如何在没有任何分区的情况下进行分区?

sum(column) over () - user330315
如果你害怕 (),你可以随时使用 (partition by NULL) - Marmite Bomber
2个回答

2

就像你所说的一样,仅仅是因为“无事”。例如:

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>

0
让我们看一下如下所示的创建表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_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;

我们将得到这个表:

交易日期 股票代码 交易类型 数量 净数量
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窗口函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接