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

如何在SQL中实现Excel INDEX-MATCH等效功能并修正分组统计错误

修正SQL查询:获取指定前缀ShipFrom的最高计数对应值

问题分析

你的查询错误原因是直接对ShipFrom取MAX会返回字典序最大的值(如FB比FA字典序大),而非按ShipFromCount排序后的最高计数对应ShipFrom。要实现需求,需先按前缀分组并对计数排序,再筛选出每组的最高计数记录。

假设示例数据表

假设你的原始数据表为ShipRecords,结构如下:

ShipFrom
FA
FA
FA
FB
FB
KA
KB
KB

统计后各ShipFrom的计数:FA=3,FB=2,KA=1,KB=2,预期输出F_MostFreq=FA、K_MostFreq=KB。

修正后的SQL查询

使用窗口函数ROW_NUMBER()按前缀分组,对计数降序排名,再提取每组排名第一的记录:

WITH ShipCounts AS (
  -- 第一步:统计每个ShipFrom的出现次数,并提取前缀
  SELECT
    ShipFrom,
    COUNT(*) AS ShipFromCount,
    LEFT(ShipFrom, 1) AS Prefix
  FROM ShipRecords
  WHERE LEFT(ShipFrom, 1) IN ('F', 'K') -- 仅筛选目标前缀
  GROUP BY ShipFrom
),
RankedShips AS (
  -- 第二步:按前缀分组,对计数降序排名(计数相同时按ShipFrom升序处理并列)
  SELECT
    ShipFrom,
    Prefix,
    ROW_NUMBER() OVER (
      PARTITION BY Prefix 
      ORDER BY ShipFromCount DESC, ShipFrom ASC
    ) AS rn
  FROM ShipCounts
)
-- 第三步:转置结果为指定格式
SELECT
  MAX(CASE WHEN Prefix = 'F' THEN ShipFrom END) AS F_MostFreq,
  MAX(CASE WHEN Prefix = 'K' THEN ShipFrom END) AS K_MostFreq
FROM RankedShips
WHERE rn = 1; -- 仅取每组排名第一的记录

关键说明

  1. ShipCounts CTE:先统计每个ShipFrom的出现次数,同时提取前缀用于后续分组。
  2. RankedShips CTE:使用ROW_NUMBER()为每个前缀组内的记录排序,确保计数最高的ShipFrom排名为1;若存在计数并列,可将ROW_NUMBER()替换为RANK()保留所有并列项,再用STRING_AGG(ShipFrom, ', ')汇总结果。
  3. 最终查询:通过条件聚合将两个前缀的结果合并为一行,符合预期输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:03:09