我有这个SQL查询:

SELECT COUNT(DISTINCT CustomerName) over(
            ORDER BY OrderTimestamp 
            RANGE BETWEEN INTERVAL 2 hour PRECEDING AND CURRENT ROW 
        ) AS count_per_time
FROM Orders
WHERE CustomerName IS NOT null
AND CustomerName != ''

但它不起作用,因为DISTINCT不允许与OVER子句一起使用.请问有谁能帮我解题吗?非常感谢.

推荐答案

我不认为这可以用窗口函数来解决.

有一种仿真技术使用dense_rank的减法,但后者不支持窗口框架规范(即:原始代码中的range/rows语法).准确地说,它实际上允许语法,但却悄悄地忽略了它:所以它仍然在整个分区上操作.这一点在the documentation节中有解释:

标准SQL指定在整个分区上操作的窗口函数不应该有FRAME子句.MySQL允许为这类函数使用FRAME子句,但会忽略它.These functions use the entire partition even if a frame is specified:

CUME_DIST()
DENSE_RANK()
LAG()
LEAD()
NTILE()
PERCENT_RANK()
RANK()
ROW_NUMBER()

似乎剩下的唯一选项就是子查询:

SELECT o.*,
    (
        SELECT COUNT(DISTINCT o1.CustomerName) 
        FROM Orders o1
        WHERE o1.CustomerName != ''
        WHERE o1.OrderTimestamp BETWEEN o.OrderTimestamp - INTERVAL 2 HOUR AND o.OrderTimestamp
    ) AS count_per_time
FROM Orders o
WHERE o.CustomerName IS NOT null and o.CustomerName != ''

Mysql相关问答推荐

try 使用TypeORM创建新表时出现SQL语法错误

过程/别名是有点长的MySQL命令的一部分吗?

如果我有USER列,如何将SQL CREATE TABLE与PostgreSQL和MySQL一起使用?

奇怪的MySQL SELECT循环;但不是\G

从 NextJS/Prisma 添加用户 ID (FK) 到 MySQL 表

将类图转换为SQL数据库

按唯一列排序,但保持匹配的列在一起

MySQL 8.0 可以在 Select 语句中返回 JSON 对象数组吗?

Mysql根据文本语言或行数将列拆分为多列

Select 并统计所有条目并根据条目对它们进行分组

为两个中的每一个 Select 最大和最小传递条件

当mysql中只有一个索引列时,为什么使用范围条件锁定读取会锁定每条记录?

从三个不同的表中生成两列,并使用分组变量计算这些列的比率

根据单个日期字段获取范围/天数

如果在表中多次发现 a 列中的相同值,则排除所有行

WHERE SQL 语句中的列顺序是否重要

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

避免重复进入mysql数据库的最佳方法

在 Android 上运行 AMP (apache mysql php)

如何从 MySQL Workbench 中的图表生成 SQL 脚本?