SQL查询各MasterID首次注册信息仅返回1条结果问题求助
问题原因
核心问题出在ROW_NUMBER()窗口函数的逻辑上:
- 你当前的写法没有设置分组规则,是全局按注册时间升序排序,所有记录共享同一个编号序列,因此
RN=1只会匹配到全系统最早注册的1条记录 - 你的需求是每个MasterID单独统计首次注册记录,需要给窗口函数增加按MasterID分组的规则,让每个MasterID对应的所有记录单独排序编号,每个分组内的编号1就对应该MasterID的最早注册记录
修正后的SQL
SELECT TOP 50 MasterID, RegistrationDate, SourceName, SystemName FROM ( SELECT a.ID_MASTER AS MasterID, a.DATE_N AS RegistrationDate, c.Name2 AS SourceName, d.Name_2 AS SystemName, -- 新增PARTITION BY按MasterID分组,组内按注册时间升序排列 ROW_NUMBER() OVER(PARTITION BY a.ID_MASTER ORDER BY a.DATE_N ASC) AS RN FROM C_Master_USER a JOIN V_DL_C_USER b ON a.ID_USER = b.ID JOIN c_source c ON b.ID_Source = c.ID JOIN C_SYS_TYPE d ON b.ID_SYS_TYPE = d.ID ) t WHERE RN = 1
注意事项
- 原SQL中
C_MASTER_USE表名和你给出的表结构C_Master_USER不一致,已修正对齐 - 如果存在同一个MasterID下多个用户注册时间完全相同的场景,
ROW_NUMBER()会随机返回其中一条,如需保留所有同时间的最早记录,可将ROW_NUMBER()替换为RANK() - 若不需要限制返回条数,可删除外层的
TOP 50关键字获取所有MasterID的结果
内容的提问来源于stack exchange,提问作者user8549489
相关产品推荐
相关产品推荐

