DISTINCT和LAG窗口功能

Luk*_*zda 9 mysql sql sql-server postgresql

有一个简单的表:

CREATE TABLE tab AS 
SELECT 1 AS t,   'G' AS company, 40 AS quote
UNION SELECT 2 , 'G',    60 
UNION SELECT 3 , 'S',    60 
UNION SELECT 4,  'S',    20;
Run Code Online (Sandbox Code Playgroud)

并查询:

SELECT DISTINCT company, quote ,LAG(quote) OVER(PARTITION BY company ORDER BY t)
FROM tab;
Run Code Online (Sandbox Code Playgroud)

输出 - 结果在RDBMS之间保持一致.

+---------+-------+------+
| company | quote | lag  |
+---------+-------+------+
| G       |    40 | null |
| S       |    60 | null |
| G       |    60 | 40   |
| S       |    20 | 60   |
+---------+-------+------+
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示 - PostgreSQL

DBFiddle演示 - SQL Server

DBFiddle演示 - Oracle 11g

DBFiddle演示 - MariaDB

DBFiddle演示 - MySQL 8.0

但是当我尝试进行一些计算时,我会得到不同的结果:

SELECT DISTINCT company, quote - LAG(quote) OVER(PARTITION BY company ORDER BY t)
FROM tab;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL/SQL Server/Oracle(正如我所料):

+---------+--------+
| company | result |
+---------+--------+
| G       | null   |
| G       | 20     |
| S       | null   |
| S       | -40    |
+---------+--------+
Run Code Online (Sandbox Code Playgroud)

MariaDB的/ MySQL的:

+----------+--------+
| company  | result |
+----------+--------+
| G        | null   |
| S        | null   |
+----------+--------+
Run Code Online (Sandbox Code Playgroud)

据我所知Logical Query Processing:

  1. 加入
  2. 哪里
  3. 通过...分组
  4. WITH CUBE/ROLLUP
  5. HAVING
  6. 选择
  7. 不同

...

DISTINCT是的,SELECT所以正确的方法应该像PostgreSQL/SQL Server/Oracle.(是的,我知道我可以使用子查询/删除,DISTINCT但这不是问题的重点).

这种行为是错误还是正常工作(文档)?

Luk*_*der 2

绝对是 MySQL 和 MariaDB 中的错误。我已向两个数据库报告了该问题,并链接回 Stack Overflow 问题: