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

SQL Server 2008替代MS Access FIRST函数获取唯一TaxGroupCode首条数据

问题:SQL Server 2008中替代Access的FIRST函数实现分组取首行拼接

原需求:按TaxGroupCode分组,获取每组对应的首个SeqGrp和SeqNum并拼接为SeqGrp-SeqNum格式,同时生成Tax District + TaxGroupCode的Sample字段。

原Access查询代码:

SELECT
    FIRST(DesotoCoPA_Trims.SeqGrp) & "-" & FIRST(DesotoCoPA_Trims.SeqNum), "Tax District " & DesotoCoPA_Trims.TaxGroupCode AS Sample
FROM  
    DesotoCoPA_Trims
GROUP BY 
    DesotoCoPA_Trims.TaxGroupCode;

原查询输出:

GrpSeq  Sample
-----------------------
2-28    Tax District 2   
5-31    Tax District 3   
6-2123  Tax District 7   
6-2128  Tax District 1   
6-9694  Tax District 6    

解决方案:使用窗口函数ROW_NUMBER()替代FIRST

SQL Server 2008不支持Access的FIRST()函数,可通过ROW_NUMBER()窗口函数标记每组内的行顺序,再筛选出每组的首行。

注意:

Access的FIRST()是取物理存储的第一行,无明确排序规则,建议在SQL中指定排序逻辑(比如按SeqGrp、SeqNum或表主键排序),确保结果稳定。

代码实现:

WITH RankedTrims AS (
    SELECT 
        SeqGrp,
        SeqNum,
        TaxGroupCode,
        -- 按需求指定排序字段,示例按SeqGrp升序,可根据实际调整
        ROW_NUMBER() OVER (PARTITION BY TaxGroupCode ORDER BY SeqGrp ASC) AS RowNum
    FROM DesotoCoPA_Trims
)
SELECT
    CAST(SeqGrp AS VARCHAR) + '-' + CAST(SeqNum AS VARCHAR) AS GrpSeq,
    'Tax District ' + CAST(TaxGroupCode AS VARCHAR) AS Sample
FROM RankedTrims
WHERE RowNum = 1;

说明:

  1. CTE RankedTrims:给每个TaxGroupCode分组的行添加行号RowNum,PARTITION BY TaxGroupCode表示按该字段分组,ORDER BY定义每组内的排序规则(决定哪一行是“首个”)。
  2. 主查询:筛选出RowNum = 1的行,拼接SeqGrp和SeqNum,同时生成Sample字段。
  3. 类型转换:如果SeqGrp、SeqNum、TaxGroupCode是数值类型,需要用CAST转换为字符串再拼接,避免报错。

如果不需要指定排序规则(和Access行为一致,取任意首行),可以把ORDER BY改为ORDER BY (SELECT NULL),但不推荐,因为结果可能不稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:42:41