如何查询SQL Server数据表以生成指定结构的结果表?
解决SQL Server中按ID提取初始与最终频率的问题
先明确下你的数据场景和需求:
原数据表(MY TABLE)
| ID | SEQNO | FREQUENCY |
|---|---|---|
| 123 | 0 | YEARLY |
| 123 | 1 | HALFYEARLY |
| 256 | 0 | QUARTERLY |
| 256 | 1 | YEARLY |
| 256 | 2 | HALFYEARLY |
| 456 | 0 | QUARTERLY |
| 456 | 1 | YEARLY |
| 456 | 2 | YEARLY |
期望结果表(RESULT TABLE)
| ID | OLDFREQUENCY | NEWFREQUENCY |
|---|---|---|
| 123 | YEARLY | HALFYEARLY |
| 256 | QUARTERLY | HALFYEARLY |
| 456 | QUARTERLY | YEARLY |
核心需求就是:对每个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
相关产品推荐
相关产品推荐

