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

Откуда:
Сообщений: 355
Добрый день!
ломаю голову над вопросом.
ID value
1 A
2 A
3 B
4 B
5 A
...
44 200 100 600 A
44 200 100 601 A
44 200 100 602 B

Необходимо получить таблицу, у которой останутся только те строки, у которых предыдущее значение отличается от текущего.
Можно в лоб сделать так:
  select T1.ID, T1.value
  from 
      T T1 
           inner join 
      T T2 
           on 
      T1.ID=T2.ID+1 and T1.value!=T2.value

Выбрасываем все индексы, с ними всё ясно. Индексы не используются (т.к., напр., первичный ключ там совсем другой)

Поэтому объединение, по сути, двух здоровых таблиц будет очень не эффективным.
Как решить подобную задачу, используя оконные функции, чтобы она работала быстрее? Чтобы по таблице был всего 1 проход, а не перемножение 44 млрд на 44 млрд.
5 авг 19, 12:53    [21942028]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2940
LAG, LEAD
5 авг 19, 13:03    [21942038]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2940
LAG, LEAD
5 авг 19, 13:09    [21942046]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 355
спасибо!
5 авг 19, 13:10    [21942049]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
londinium
Member

Откуда: Киев
Сообщений: 1119
что-то такое:
WITH CTE AS
(
  SELECT 1 AS ID,'A'AS VAL  
    UNION ALL
  SELECT 2 AS ID,'B'AS VAL  
    UNION ALL
  SELECT 3 AS ID,'C'AS VAL  
    UNION ALL
  SELECT 4 AS ID,'D'AS VAL  
    UNION ALL
  SELECT 5 AS ID,'D'AS VAL  
    UNION ALL
  SELECT 6 AS ID,'X'AS VAL  
)
SELECT C.ID,C.VAL,
LAG(C.VAL)OVER(ORDER BY ID ASC) XCOL
FROM CTE C;
5 авг 19, 13:12    [21942050]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
AlexKM2020
Member

Откуда:
Сообщений: 12
select s.*
from(
       select ROW_NUMBER() over(partition by [value] order by id) as cnt
       from [source].ProductNames
      )s
where s.cnt = 1;


delete s
from(
       select ROW_NUMBER() over(partition by [value] order by id) as cnt
       from [source].ProductNames
       )s
where s.cnt != 1;
6 авг 19, 16:44    [21943099]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1124
AlexKM2020
select s.*
from(
       select ROW_NUMBER() over(partition by [value] order by id) as cnt
       from [source].ProductNames
      )s
where s.cnt = 1;


delete s
from(
       select ROW_NUMBER() over(partition by [value] order by id) as cnt
       from [source].ProductNames
       )s
where s.cnt != 1;

Слушайте, вы хоть сами проверяйте, прежде чем такие советы давать.
Этот скрипт оставит только первое значение для каждого value. А не первое после изменения значения, как требуется автору.
6 авг 19, 16:47    [21943105]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19613
хорошо я согласен
Необходимо получить таблицу, у которой останутся только те строки, у которых предыдущее значение отличается от текущего.
"Получить таблицу" я лично воспринимаю как "привести исходную таблицу к указанному виду" - т.е. удалить всё, что не соответствует условию. Но дальше Вы показываее получение не таблицы, а выборки...

Кстати, получение выборки (вряд ли компактной) из 44 млрд. записей мне кажется занятием из категории "странное"...
6 авг 19, 19:24    [21943251]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
хорошо я согласен
Member

Откуда:
Сообщений: 355
Akina
хорошо я согласен
Необходимо получить таблицу, у которой останутся только те строки, у которых предыдущее значение отличается от текущего.
"Получить таблицу" я лично воспринимаю как "привести исходную таблицу к указанному виду" - т.е. удалить всё, что не соответствует условию. Но дальше Вы показываее получение не таблицы, а выборки...

Кстати, получение выборки (вряд ли компактной) из 44 млрд. записей мне кажется занятием из категории "странное"...

да, выборка

44 млрд - это из головы просто взято. Ну, 44 млн. Это необходимо для создания измерения для куба.
9 авг 19, 12:57    [21945542]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19613
Хорошо ж тебе живётся... с 44 млрд. записями в голове Картинка с другого сайта.
9 авг 19, 12:59    [21945545]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
А что? Если в базу инсёртить каждый стриженный волос во всех парикмахерских мира... Да за 10 лет...
Но надо ли?
9 авг 19, 13:06    [21945553]     Ответить | Цитировать Сообщить модератору
 Re: как удалить все повторы подряд из последовательности AAABBBABAAA?  [new]
iap
Member

Откуда: Москва
Сообщений: 46899
Akina
Хорошо ж тебе живётся... с 44 млрд. записями в голове Картинка с другого сайта.
Там намного больше!
Это только взято 44 млрд.
9 авг 19, 13:07    [21945556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить