SQL 或 LINQ:我如何 select 记录只有一个参数发生变化的地方?
SQL or LINQ: how do I select records where only one paramater changes?
假设我们有这个列表:
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" 更改时,我都需要 select 一个包含记录的列表。所以结果将是:
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 中,这里有一种使用 window 函数解决它的方法:
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
排序。然后外部查询过滤该值与当前行中的值不同的记录。
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
假设我们有这个列表:
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" 更改时,我都需要 select 一个包含记录的列表。所以结果将是:
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 中,这里有一种使用 window 函数解决它的方法:
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
排序。然后外部查询过滤该值与当前行中的值不同的记录。
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