说我们有此列表:
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中,这是一种使用窗口函数解决它的方法:
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 |另一列-:| ----:| -------:| :------------448 | 70 | 1 | 228455 | 70 | 2 | 2a8458 | 70 | 3 | v460 | 70 | 4 | 22461 | 70 | 3 | 54462 | 70 | 4 | 45463 | 70 | 3 | s28