窗口函数:如何分区?

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');

我们想将quantitytrans_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

【讨论】:

以上是关于窗口函数:如何分区?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用窗口函数枚举 Postgres 表中的分区组?

从 SQL 窗口函数中排除分区?

添加分区以及分析函数和窗口函数

Oracle ---- 窗口函数

带有窗口函数的 PySpark 数据偏度

窗口函数问题 - 分区最大