You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL用户预订序列生成及聚合查询报错解决方案

PostgreSQL 订单聚合表查询实现

我刚开始学习PostgreSQL,想要构建一张包含以下字段的聚合表:

  • user_id
  • booking_sequence
  • booking_created_time
  • booking_paid_time
  • booking_price_amount
  • total_spent

除booking_sequence字段外,其余所有字段均已提供。我需要编写查询语句,筛选出购买次数不少于指定次数、消费总额超过指定金额的每个用户的前5笔机票订单,查询结果先按用户消费总额排序,再按booking_sequence字段排序。

我最初尝试编写了如下代码:

select user_id,
       row_number() over(partition by user_id order by user_id) as booking_sequence,
       booking_created_time as booking_created_date,
       booking_price_amount,
       sum(booking_price_amount) as total_booking_price_amount
from fact_flight_sales 
group by user_id, booking_created_time, booking_price_amount 
having count(user_id) > 5
   and total_booking_price_amount > 1000
order by total_booking_price_amount;

运行时遇到两个问题:添加count(user_id) > 5条件后查询结果为空,且在HAVING子句中使用别名total_booking_price_amount时提示字段不存在。


最终实现方案

后续我调整代码实现了预期功能,参考代码如下:

select x.user_id, row_number() over(partition by x.user_id) 
as booking_sequence, x.booking_created_time::date as booking_created_date, x.booking_price_amount, 
sum(y.booking_price_amount) as total_booking_price_amount from 
(
    select user_id, booking_created_time, booking_price_amount from fact_flight_sales 
    group by user_id, booking_created_time, booking_price_amount
) as x
join 
(
    select user_id, booking_price_amount 
    from fact_flight_sales group by user_id, booking_price_amount
) as y
on x.user_id = y.user_id
group by x.user_id, x.booking_created_time, x.booking_price_amount 
having count(x.user_id) >= 1 and sum(y.booking_price_amount) >250000 
order by total_booking_price_amount desc, booking_sequence asc;

感谢Laurenz的帮助。

内容的提问来源于stack exchange,提问作者Rivaldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:24:02