首页 > 解决方案 > SQL 或 LINQ:如何选择只有一个参数更改的记录?

问题描述

假设我们有这个列表:

Id  IdRef   myColumn    anotherColumn
448    70      1            228
449    70      1            2s8
451    70      1            228
455    70      2            2a8
456    70      2            s28
457    70      2            28
458    70      3            v
459    70      3            28
460    70      4            22
461    70      3            54
462    70      4            45
463    70      3            s28

每次“myColumn”更改时,我都需要选择一个包含记录的列表。所以结果是:

    Id  IdRef   myColumn    anotherColumn
448    70      1            228
455    70      2            2a8
458    70      3            v
460    70      4            22
461    70      3            54
462    70      4            45
463    70      3            s28

标签: sqldatabaselinqwindow-functionsgaps-and-islands

解决方案


这是一个空白和孤岛问题。在 SQL 中,这是使用窗口函数解决它的一种方法:

select Id, IdRef, myColumn, anotherColumn
from (
    select t.*, lag(myColumn) over(partition by IdRef order by Id) lagMyColumn
    from mytable t
) t
where lagMyColumn is null or lagMyColumn <> myColumn

内部查询恢复一行的值,myColumn按排序。然后外部查询过滤该值与当前行上的值不同的记录。Id

DB Fiddle 上的演示

编号 | idref | 专栏 | 另一栏
--: | ----: | --------: | :------------
448 | 70 | 1 | 228          
455 | 70 | 2 | 2a8          
第458章 70 | 3 | v            
460 | 70 | 4 | 22           
461 | 70 | 3 | 54           
第462章 70 | 4 | 45           
第463章 70 | 3 | s28          

推荐阅读