如何为Analysis表中按优先级排序的ReceptionId分组生成连续序号
解决Analysis表中按排序顺序生成ReceptionId分组连续序号的问题
问题分析
你需要的是按Analysis表的排序规则(当日Patient_OrdNumber_ByNumberOfRequiredAnalysis)给连续的ReceptionId分组分配唯一连续序号,直接用DENSE_RANK()按ReceptionId排序会导致序号基于ReceptionId本身的顺序,而非实际报表展示的分组顺序,这就是你之前未得到预期结果的原因。
正确实现思路
核心是先确定每个ReceptionId分组在排序后的结果集中的起始位置,再基于这个起始位置生成连续的组序号,确保序号与报表展示的分组顺序一致。
具体SQL实现(以支持窗口函数的数据库为例,如SQL Server、PostgreSQL)
方法一:分步CTE实现(可读性强)
WITH RankedRecords AS ( -- 按当日排序规则给每条化验记录分配行号 SELECT *, ROW_NUMBER() OVER ( PARTITION BY TestDate ORDER BY Patient_OrdNumber_ByNumberOfRequiredAnalysis ) AS RowNum FROM Analysis ), GroupStartPositions AS ( -- 找到每个ReceptionId分组在当日的起始行号 SELECT ReceptionId, TestDate, MIN(RowNum) AS GroupStartRow FROM RankedRecords GROUP BY ReceptionId, TestDate ), GroupSequences AS ( -- 基于起始行号生成连续的组序号 SELECT ReceptionId, TestDate, DENSE_RANK() OVER ( PARTITION BY TestDate ORDER BY GroupStartRow ) AS GroupSeq FROM GroupStartPositions ) -- 关联回原表,得到每条记录对应的组序号 SELECT a.*, gs.GroupSeq FROM Analysis a JOIN GroupSequences gs ON a.ReceptionId = gs.ReceptionId AND a.TestDate = gs.TestDate ORDER BY a.TestDate, a.Patient_OrdNumber_ByNumberOfRequiredAnalysis;
方法二:嵌套窗口函数(更简洁)
SELECT *, -- 基于分组起始行号生成连续组序号 DENSE_RANK() OVER ( PARTITION BY TestDate ORDER BY GroupStartRow ) AS GroupSeq FROM ( SELECT *, -- 计算当前ReceptionId分组在当日的起始行号 MIN(ROW_NUMBER() OVER ( PARTITION BY TestDate ORDER BY Patient_OrdNumber_ByNumberOfRequiredAnalysis )) OVER ( PARTITION BY ReceptionId, TestDate ) AS GroupStartRow FROM Analysis ) AS T ORDER BY TestDate, Patient_OrdNumber_ByNumberOfRequiredAnalysis;
效果说明
- 同一
ReceptionId的所有化验记录会得到相同的GroupSeq值 GroupSeq会按照Patient_OrdNumber_ByNumberOfRequiredAnalysis的排序顺序连续递增(1,2,3...),完美适配报表的奇偶组着色需求
内容的提问来源于stack exchange,提问作者Condottiero
相关产品推荐
相关产品推荐

