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

如何不使用子查询实现DISTINCT ON去重后按其他列GROUP BY统计行数

问题分析

你当前的查询存在两个核心问题:

  • 窗口函数count(1) over (partition by order_num)统计的是单个订单号对应的总更新次数,不是你需要的按日期、区域分组的订单数
  • 缺少按date、region分组聚合的逻辑,查询返回的是每个订单最新记录的明细,自然会出现重复的日期+区域组合
正确实现方案

首先说明:你需要的逻辑本质是「先按订单号过滤最新记录、再按日期区域分组统计」,用子查询/CTE拆分两步逻辑是可读性最高、性能最优的写法,不需要刻意避免嵌套。

方案1:DISTINCT ON + CTE(最简洁,PostgreSQL专属)

WITH latest_orders AS (
  SELECT DISTINCT ON (order_num)
    date,
    region
  FROM orders_table
  ORDER BY order_num, timestamp_updated DESC
)
SELECT 
  date,
  region,
  COUNT(*) AS order_count
FROM latest_orders
GROUP BY date, region;

方案2:窗口函数ROW_NUMBER实现(兼容所有支持窗口函数的SQL引擎)

SELECT 
  date,
  region,
  COUNT(*) AS order_count
FROM (
  SELECT
    date,
    region,
    ROW_NUMBER() OVER (PARTITION BY order_num ORDER BY timestamp_updated DESC) AS rn
  FROM orders_table
) t
WHERE rn = 1 -- 仅保留每个订单的最新记录
GROUP BY date, region;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:18:02