sql - 删除相隔不到 2 分钟的订单时出现 PostgreSQL 错误 SQL 错误 [42803]:错误:WHERE 中不允许使用聚合函数
问题描述
删除相隔不到 2 分钟的订单时出现以下错误,但我无法使用HAVING
,因为子查询中没有 a GROUP BY
。
我是否正确地处理了这个问题,我应该GROUP
做些什么来完成这项工作吗?
SQL 错误 [42803]:错误:WHERE 中不允许使用聚合函数
SELECT customer_id,
MAX(created_at) last_order_date,
MAX(created_at) + ((SELECT EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at))
FROM (SELECT customer_id, created_at
FROM (SELECT customer_id, created_at, rank() over (partition by customer_id order by created_at desc) lasttwo
FROM orders) sub
WHERE sub.lasttwo <= 2
AND SUM(EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at))) > 2) s2) ::text||' minute')::INTERVAL AS nextdate,
(SELECT AVG(total_price - total_tax)
FROM (SELECT customer_id, created_at, total_price, total_tax
FROM (SELECT customer_id, created_at, total_price, total_tax, rank() over (partition by customer_id order by created_at desc) lasttwo
FROM orders) sub
WHERE sub.lasttwo <= 2
AND SUM(EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at))) > 2) s2) nextvalue
FROM orders
GROUP BY customer_id
解决方案
好的,我使用 CTE 重写了您的查询,并修复了聚合。这里是:
with
sub as (
SELECT customer_id, created_at, total_price, total_tax,
rank() over (partition by customer_id order by created_at desc) lasttwo
FROM orders
),
s2 as (
SELECT customer_id, created_at, total_price, total_tax
FROM sub
WHERE sub.lasttwo <= 2
GROUP BY customer_id, created_at, total_price, total_tax -- fix #1
HAVING SUM(EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at))) > 2 -- fix #2
),
subx as (
SELECT customer_id, created_at,
rank() over (partition by customer_id order by created_at desc) lasttwo
FROM orders
),
s2x as (
SELECT customer_id, created_at
FROM subx
WHERE sub.lasttwo <= 2
GROUP BY customer_id, created_at -- fix #3
HAVING SUM(EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at))) > 2 -- fix #4
)
SELECT customer_id,
MAX(created_at) last_order_date,
MAX(created_at) + ((
SELECT EXTRACT(MINUTE FROM MAX(created_at)-MIN(created_at)) from s2x
) ::text||' minute')::INTERVAL AS nextdate,
(SELECT AVG(total_price - total_tax) from s2) nextvalue
FROM orders
GROUP BY customer_id
我无法真正运行此查询并对其进行真实测试,但您明白了。
顺便说一句,sub
可以s2
合并成一个单独的CTE。subx
和也可以这样说s2x
。
推荐阅读
- javascript - 处理 nodejs 承诺链中传入的参数
- flutter - 在 Pushing FlutterViewController 时,出现 iOS 启动/启动屏幕
- sql - 删除/删除具有空值的列
- assembly - 我正在编写 HLA(高级程序集)以找到最大值。并返回 AH 寄存器
- javascript - React Native Case 语句、If 语句或基于值的条件渲染
- arduino - 编译代码时,Arduino IDE (1.8.15) 在计算动态内存时是否存在问题?
- python - PyInstaller 无法生成 mayavi/qt5 应用程序:KeyError: 'traitsui.toolkits'
- java - FABRIC MODDING - BlockEntityRenderer 渲染块实体库存中的项目
- webassembly - 我需要参考 Uno.Web.Http.CookieManager 有什么用
- linux - 使用子例程将数字字符串转换为整数