【问题标题】:SQL or LINQ: how do I select records where only one paramater changes?SQL 或 LINQ:如何选择只有一个参数更改的记录?
【发布时间】:2020-05-20 09:38:36
【问题描述】:

假设我们有这个列表:

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

【问题讨论】:

标签: sql database linq window-functions gaps-and-islands


【解决方案1】:

这是一个空白和孤岛问题。在 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排序。然后外部查询过滤该值与当前行中的值不同的记录。

Demo on 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多