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

SQL查询2020年5月注册且首月消费最高的Top10客户

解法说明

你原有查询存在几个明显问题,无法满足当前需求:

  • 使用隐式逗号连接表,可读性差,不符合现代SQL编写规范
  • 字段引用存在错误:订单表金额字段为usd_value,你写的order_value_usd不存在;你标注的Orders表customer_ts字段应为笔误,正常关联客户表需要customer_id字段,以下解法默认该关联字段为customer_id,如果实际字段名有差异可直接替换
  • 没有筛选「注册后首月内」的订单范围,也缺少按客户维度聚合、排序取Top N的逻辑
  • 时间筛选用BETWEEN对于带时分秒的时间戳存在逻辑误差,会误算边界时间的数据
可直接运行的SQL(以MySQL为例)

实现逻辑:

  1. 先筛选2020年5月注册的所有客户
  2. 关联订单表时,仅关联该客户注册时间之后、注册满1个月之前的有效订单
  3. 按客户维度聚合,计算每个客户首月累计订单金额,无订单则记为0
  4. 按累计金额降序排序,取前10条记录
SELECT
  c.customer_id,
  c.registered_ts,
  COALESCE(SUM(o.usd_value), 0) AS first_month_order_total
FROM customers c
LEFT JOIN orders o
  ON c.customer_id = o.customer_id
  AND o.order_ts >= c.registered_ts
  AND o.order_ts < DATE_ADD(c.registered_ts, INTERVAL 1 MONTH)
WHERE
  c.registered_ts >= '2020-05-01'
  AND c.registered_ts < '2020-06-01'
GROUP BY c.customer_id, c.registered_ts
ORDER BY first_month_order_total DESC
LIMIT 10;
其他数据库适配
  • PostgreSQL:将日期计算逻辑替换为o.order_ts < c.registered_ts + INTERVAL '1 month',其余逻辑不变,取数仍用LIMIT 10
  • SQL Server:将日期计算逻辑替换为o.order_ts < DATEADD(MONTH, 1, c.registered_ts),去掉末尾的LIMIT 10,在SELECT后加TOP 10即可
  • Oracle:将日期计算逻辑替换为o.order_ts < ADD_MONTHS(c.registered_ts, 1),去掉末尾的LIMIT 10,在语句末尾加FETCH FIRST 10 ROWS ONLY

注:时间筛选统一用左闭右开(>= 起始时间,< 结束时间)的写法,可完全覆盖带时分秒的时间戳场景,避免BETWEEN带来的边界数据统计错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:18:21