Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Есть таблица
DECLARE @Table1 table (ID int, val int, dd date)
INSERT @Table1 values(1,2,'2005-12-09')
INSERT @Table1 values(1,1,'2008-04-02')
INSERT @Table1 values(1,2,'2009-12-29')
INSERT @Table1 values(1,2,'2010-12-29')
INSERT @Table1 values(1,2,'2012-02-01')
INSERT @Table1 values(1,3,'2016-04-05')
INSERT @Table1 values(2,3,'2001-05-05')
INSERT @Table1 values(2,3,'2016-04-05')

нужно выбрать каждую первую строку после изменения val

на выходе должно получиться
1,2,'2005-12-09'
1,1,'2008-04-02'
1,2,'2009-12-29'
1,3,'2016-04-05'
2,3,'2001-05-05'
21 июн 16, 11:23    [19318028]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
TJ001
каждую первую строку
и чем определяется порядок следования строк?
21 июн 16, 11:34    [19318076]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
TJ001,

select id, val, min(dd) as x_dd 
  from (
         select t.*
               , row_number() over(partition by id, val order by dd) - 
                 row_number() over(partition by id order by dD) as grp_id
           from @table1 t) v
 group by id, val, grp_id
 ORDER BY ID, MIN(DD)
21 июн 16, 11:36    [19318087]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
Дедушка,

очевидно, сортировкой по DD в рамках отдельно взятого ID
21 июн 16, 11:36    [19318092]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Дедушка,

порядок id,dd,val
21 июн 16, 11:37    [19318095]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Добрый Э - Эх
Дедушка,
очевидно, сортировкой по DD в рамках отдельно взятого ID

для блока
INSERT @Table1 values(1,3,'2016-04-05')
INSERT @Table1 values(2,3,'2001-05-05')
INSERT @Table1 values(2,3,'2016-04-05')
с результатом
1,3,'2016-04-05'
2,3,'2001-05-05'
это вовсе не очевидно :)
21 июн 16, 11:38    [19318099]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
TJ001
Дедушка,

порядок id,dd,val

хотя сортировка по val тут бесполезна, dd не может повторяться
21 июн 16, 11:38    [19318103]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
Дедушка,

чо не так с этим блоком? ID изменился с 1 на 2, началась новая группа. Сортировка по DD внутри группы. вроде все логично.
21 июн 16, 11:40    [19318114]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Добрый Э - Эх
TJ001,

select id, val, min(dd) as x_dd 
  from (
         select t.*
               , row_number() over(partition by id, val order by dd) - 
                 row_number() over(partition by id order by dD) as grp_id
           from @table1 t) v
 group by id, val, grp_id
 ORDER BY ID, MIN(DD)


балииин! то шо надо! спасибо!!!! :)
21 июн 16, 11:41    [19318121]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
TJ001,

если версия сервера позволяет, то можно разность двух ровнумберов заменить на lead/lag и на верхнем уровне вильтровать по этому флагу:
select id, val, dd
  from (
         select t.*
              , case lead(val) over(partition by id order by dd)
                  when val 
                    then 0 
                  else 1 
                end as flag
           from @table1 t
       ) v
  where flag = 1
 order by id, dd
21 июн 16, 11:46    [19318138]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Добрый Э - Эх
чо не так с этим блоком? ID изменился с 1 на 2, началась новая группа.
постановка задачи:
TJ001
нужно выбрать каждую первую строку после изменения val
где здесь про "ID изменился... началась новая группа"?
Впрочем, автор удовлетворён, посему всё хор :)
21 июн 16, 11:46    [19318141]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Добрый Э - Эх,

позволяет
спасибо, сэр! :)
21 июн 16, 11:47    [19318149]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
Конечно же LAG
Добрый Э - Эх
TJ001,

если версия сервера позволяет, то можно разность двух ровнумберов заменить на lead/lag и на верхнем уровне вильтровать по этому флагу:
select id, val, dd
  from (
         select t.*
=>              , case LAG(val) over(partition by id order by dd)
                  when val 
                    then 0 
                  else 1 
                end as flag
           from @table1 t
       ) v
  where flag = 1
 order by id, dd
21 июн 16, 11:47    [19318152]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
Конечно же LAG
Добрый Э - Эх
TJ001,

если версия сервера позволяет, то можно разность двух ровнумберов заменить на lead/lag и на верхнем уровне вильтровать по этому флагу:
select id, val, dd
  from (
         select t.*
              , case LAG(val) over(partition by id order by dd)
                  when val 
                    then 0 
                  else 1 
                end as flag
           from @table1 t
       ) v
  where flag = 1
 order by id, dd
21 июн 16, 11:49    [19318161]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Дедушка,

я не полностью описал, признаюсь))
каждая новая группа начинается при изменении val внутри id либо изменении id
21 июн 16, 11:50    [19318173]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Добрый Э - Эх
Конечно же LAG
Добрый Э - Эх
TJ001,

если версия сервера позволяет, то можно разность двух ровнумберов заменить на lead/lag и на верхнем уровне вильтровать по этому флагу:
select id, val, dd
  from (
         select t.*
              , case LAG(val) over(partition by id order by dd)
                  when val 
                    then 0 
                  else 1 
                end as flag
           from @table1 t
       ) v
  where flag = 1
 order by id, dd


не самый быстрый вариант
21 июн 16, 13:02    [19318474]     Ответить | Цитировать Сообщить модератору
 Re: Как выкинуть дубли из последовательности строк?  [new]
Добрый Э - Эх
Guest
a_voronin,

приведи более быстрый вариант, порадуй топикстартера.
21 июн 16, 13:06    [19318495]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить