SQL или LINQ: как выбрать записи, в которых изменяется только один параметр? - PullRequest
0 голосов
/ 04 февраля 2020

Скажем, у нас есть этот список:

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

1 Ответ

3 голосов
/ 04 февраля 2020

Это проблема пробелов и островков. В 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. Затем внешний запрос фильтрует записи, в которых это значение отличается от значения в текущей строке.

Демонстрация на БД Fiddle :

 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          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...