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

如何查询SQL Server数据表以生成指定结构的结果表?

解决SQL Server中按ID提取初始与最终频率的问题

先明确下你的数据场景和需求:

原数据表(MY TABLE)

IDSEQNOFREQUENCY
1230YEARLY
1231HALFYEARLY
2560QUARTERLY
2561YEARLY
2562HALFYEARLY
4560QUARTERLY
4561YEARLY
4562YEARLY

期望结果表(RESULT TABLE)

IDOLDFREQUENCYNEWFREQUENCY
123YEARLYHALFYEARLY
256QUARTERLYHALFYEARLY
456QUARTERLYYEARLY

核心需求就是:对每个ID,把SEQNO=0对应的FREQUENCY作为初始值(OLDFREQUENCY),把该ID下最大SEQNO对应的FREQUENCY作为最终值(NEWFREQUENCY)。

给你两种可行的SQL Server查询方案,按需选择:

方案一:分组子查询关联法

逻辑很直观,先找出每个ID的最大SEQNO,再分别关联原表拿到初始和最终频率:

SELECT 
    t.ID,
    old.FREQUENCY AS OLDFREQUENCY,
    new.FREQUENCY AS NEWFREQUENCY
FROM (
    -- 第一步:获取每个ID的最大SEQNO值
    SELECT ID, MAX(SEQNO) AS MaxSeq
    FROM MY_TABLE
    GROUP BY ID
) t
-- 关联获取SEQNO=0的初始频率
JOIN MY_TABLE old ON t.ID = old.ID AND old.SEQNO = 0
-- 关联获取最大SEQNO对应的最终频率
JOIN MY_TABLE new ON t.ID = new.ID AND new.SEQNO = t.MaxSeq;

方案二:窗口函数法

用ROW_NUMBER()窗口函数给每个ID组内的记录排序,再通过条件聚合提取目标值,代码更简洁:

WITH RankedData AS (
    SELECT 
        ID,
        FREQUENCY,
        SEQNO,
        -- 按SEQNO降序排名,每组第一就是最大SEQNO的记录
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SEQNO DESC) AS rn_desc,
        -- 按SEQNO升序排名,每组第一就是SEQNO=0的记录
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SEQNO ASC) AS rn_asc
    FROM MY_TABLE
)
SELECT 
    ID,
    -- 提取初始频率(SEQNO最小的那条)
    MAX(CASE WHEN rn_asc = 1 THEN FREQUENCY END) AS OLDFREQUENCY,
    -- 提取最终频率(SEQNO最大的那条)
    MAX(CASE WHEN rn_desc = 1 THEN FREQUENCY END) AS NEWFREQUENCY
FROM RankedData
GROUP BY ID;

两种方案都能得到你想要的结果,第一种适合数据量不大、追求逻辑直观的场景;第二种用窗口函数,在处理更复杂的排序/分组需求时扩展性更好,性能表现也不错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:23:25