请求协助编写SQL查询:为Table1选择并合并Active Record ID
解决方案:用窗口函数实现分组获取活跃记录ID
嘿,这个需求很清晰——你需要给每个Name+PID分组里的所有记录,都带上该组中updateDT为NULL的那条“活跃记录”的ID。下面两种方法都能完美实现你的目标:
方法一:窗口函数(推荐,简洁高效)
窗口函数是处理这类分组内关联计算的最佳选择,不需要额外的关联操作,性能更优:
SELECT ID, Name, PID, updateDT, -- 分组内找到updateDT为NULL的记录ID,填充到组内所有行 MAX(CASE WHEN updateDT IS NULL THEN ID END) OVER (PARTITION BY Name, PID) AS Lt_Record FROM Table1;
代码解释:
PARTITION BY Name, PID:将数据按Name和PID划分为独立的分组,同一组的记录共享计算结果MAX(CASE WHEN updateDT IS NULL THEN ID END):在每个分组里筛选出updateDT为NULL的记录ID,因为每组仅有一条这样的记录,用MAX/MIN/FIRST_VALUE都能拿到这个唯一ID- 窗口函数会自动把这个活跃ID填充到组内的每一行,完全匹配你想要的输出结果
方法二:子查询关联
如果你更习惯用传统的关联写法,也可以先提前查询出每个分组的活跃ID,再关联回原表:
SELECT t1.ID, t1.Name, t1.PID, t1.updateDT, t2.active_id AS Lt_Record FROM Table1 t1 INNER JOIN ( -- 先获取每个分组的活跃记录ID(updateDT为NULL的那条) SELECT Name, PID, ID AS active_id FROM Table1 WHERE updateDT IS NULL ) t2 ON t1.Name = t2.Name AND t1.PID = t2.PID;
注意事项:
这个方法的前提是每个Name+PID分组恰好有一条updateDT为NULL的记录,和你提供的测试数据情况一致。如果存在分组有多个NULL记录的场景,需要调整子查询(比如用GROUP BY Name,PID取MIN(ID)或MAX(ID))。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

