powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти дубль но только если он дублирует предыдущую строку
25 сообщений из 26, страница 1 из 2
Найти дубль но только если он дублирует предыдущую строку
    #40106277
kolyady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем

нужно найти дубли по определенным полям , но только если дубликат идет следующим по порядку например

есть таблица в ней
id num
1, 3
2, 2
3, 5
4, 2
5, 2
6, 5
7, 3

в данном случае должно вывести строку с id = 5
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106283
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolyady
Привет всем

нужно найти дубли по определенным полям , но только если дубликат идет следующим по порядку например

есть таблица в ней
id num
1, 3
2, 2
3, 5
4, 2
5, 2
6, 5
7, 3

в данном случае должно вывести строку с id = 5


Если вы сами понимаете как это "если дубликат идет следующим по порядку"
то объясните подробнее, желательно в терминах SQL. Вы знакомы с SQL ?
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106287
kolyady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,
Значение в поле num равно предыдущему так понятней?
На данном примере 4 и 5 id имеют одинаковое значение в поле num (2) поэтом 5-й id дублирует значение 4 -го id
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106289
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL нет такого слова, как "предыдущий".
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106290
kolyady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сотрю пока одни "знатоки" SQL отозвались, надеюсь кто-нибудь по теме все таки ответит. "Знатоков" просьба проходить мимо.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106295
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolyady
Сотрю пока одни "знатоки" SQL отозвались, надеюсь кто-нибудь по теме все таки ответит. "Знатоков" просьба проходить мимо.


"Сотреть" мало Вы сами сюда пришли.
Еще раз: объясните подробнее, желательно в терминах SQL. Вы знакомы с SQL ?
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106304
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolyady
Значение в поле num равно предыдущему так понятней?
Напишите формулу, по которой можно вычислить, какая запись являются "предыдущей" для любой из записей в таблице.
Тогда нужный вам запрос напишется практически сам собой.
так понятней? :-)
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106307
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolyady,

реляционные данные неупорядочены, действительно нет понятия "предыдущий". таблицы 1,2,3,4,5 и 5,3,4,1,2 полностью идентичны.

3, 5
4, 2
5, 2
и
4, 2
3, 5
5, 2

это одинаковые наборы данных. Я понимаю, что автору необходимо найти и сгруппировать все строки все строки, при условии, что количество повторяющихся значений num > 1 при условии, что ряд чисел id в группах не прерывается, при этом в результирующий набор должны попасть строки с минимальным значением id, все строки с уникальными num и группы, состоящих из одного элемента.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106313
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolyady,
Код: sql
1.
2.
3.
4.
5.
declare @t TABLE (id int, num int)
INSERT INTO @t 
(id, num) VALUES (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 5),(7, 3)
;WITH c AS (SELECT *, LAG(num, 1,0) OVER (ORDER BY id) AS nextNum FROM @t)
SELECT * FROM c WHERE num = nextNum
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106373
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolyady,

Традиционное решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with A as (
 select * from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 5),(7, 3)) as T(id, num)
-- select * from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 2),(7, 5),(8, 3)) as T(id, num)
)

select *
  from A a
  join A b on b.id=a.id-1 and b.num=a.num;


Остался вопрос, что должно быть выведено, если 2-ки будут идти подряд более 2-х раз:

4, 2
5, 2
6, 2
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106374
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.
В SQL нет такого слова, как "предыдущий".


почему нет?
авторПредложение LAG (Transact-SQL)
Обращается к данным из предыдущей строки того же результирующего набора без использования самосоединения начиная с SQL Server 2012 (11.x). Функция LAG обеспечивает доступ к строке с заданным физическим смещением перед началом текущей строки. Используйте данную аналитическую функцию в инструкции SELECT для сравнения значений текущей строки со значениями из предыдущей .
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106382
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql,

LAG ... Выглядит как придирка к формулировке "в SQL". Да, правильно было бы написать "у отношений". SQL изначально апокрифичен.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106451
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql
почему нет?
В цитате "того же результирующего набора". А у автора таблица.
То есть автор должен сказать, как определяется очерёдность записей в результирующем наборе, тогда ответить на вопрос можно.
Massa52 предположил, что набор упорядочен по id, но это может быть и не так.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106461
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql
Alibek B.
В SQL нет такого слова, как "предыдущий".


почему нет?
авторПредложение LAG (Transact-SQL)
Обращается к данным из предыдущей строки того же результирующего набора без использования самосоединения начиная с SQL Server 2012 (11.x). Функция LAG обеспечивает доступ к строке с заданным физическим смещением перед началом текущей строки. Используйте данную аналитическую функцию в инструкции SELECT для сравнения значений текущей строки со значениями из предыдущей .


"В SQL нет"
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106513
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

1." В цитате "того же результирующего набора". А у автора таблица ".

"Мой дядя самых честных правил" спросил: "А что в заветах Кодда сказано о том?".

Правило 1. (The Information Rule): Вся информация в реляционной базе данных на логическом уровне должна быть явно представлена единственным способом: значениями в таблицах.

Следовательно, любой результат применения любых операций к любым таблицам должен быть представлен таблицей. Т.е. ваш "результирующий набор" является такой же таблицей, как и "автора таблица".

2." автор должен сказать, как определяется очерёдность записей в результирующем наборе "

Так он в дополнение к своему вопросу пояснил ( 22387160 ): " На данном примере 4 и 5 id имеют одинаковое значение в поле num (2) поэтом 5-й id дублирует значение 4-го id ". Следовательно, без всякого предположения можно сказать, что строки "автора таблицы" ("результирующего набора") упорядочены по id. Вы не дочитали до конца это сообщение.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106537
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l
kolyady,

Традиционное решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with A as (
 select * from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 5),(7, 3)) as T(id, num)
-- select * from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 2),(7, 5),(8, 3)) as T(id, num)
)

select *
  from A a
  join A b on b.id=a.id-1 and b.num=a.num;


Остался вопрос, что должно быть выведено, если 2-ки будут идти подряд более 2-х раз:

4, 2
5, 2
6, 2

Частное решение. А в общем понятии: плохое решение. Потому что:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 select  * into #A from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 2),(7, 5),(8, 3)) as T(id, num)


delete from #A where id = 5

select *
  from #A a
  join #A b on b.id=a.id-1 and b.num=a.num;

drop table #A
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106572
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Gerasimenko: " Частное решение. А в общем понятии: плохое решение. Потому что... "

Нет, совсем не потому, а потому что, только наш человек сначала наведет порядок, потом сознательно нарушит этот с таким трудом наведенный порядок и будет продолжать думать, что наведенный порядок не изменился.

2. Gerasimenko, что вы фактически сделали? Вы выкололи точку 5, т.е. последовательность

4, 2
5, 2
6, 2

вы заменили на последовательность

4, 2
5, null
6, 2

Запрос должен вернуть пустой набор. Проверьте! И это правильный результат!

3. Приведенный мной запрос - это одна из реализаций LAG.

4. Пропуски в нумерации событий не критичны, так как всегда можно пересчитать нумерацию по id.
Если же значение num повторяется подряд более одного раза, то LAG, возможно, не поможет,
и нужно будет искать интервалы непрерывности num, длина которых больше 1, о чем несколько сумбурно сказал Владислав Колосов ( 22387187 ).

5. Не нужно думать, что ТС привел таблицу в которой хранятся реальные данные.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106576
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l
1. Gerasimenko: " Частное решение. А в общем понятии: плохое решение. Потому что... "

Нет, совсем не потому, а потому что, только наш человек сначала наведет порядок, потом сознательно нарушит этот с таким трудом наведенный порядок и будет продолжать думать, что наведенный порядок не изменился.

2. Gerasimenko, что вы фактически сделали? Вы выкололи точку 5, т.е. последовательность

4, 2
5, 2
6, 2

вы заменили на последовательность

4, 2
5, null
6, 2

Запрос должен вернуть пустой набор. Проверьте! И это правильный результат!

3. Приведенный мной запрос - это одна из реализаций LAG.

4. Пропуски в нумерации событий не критичны, так как всегда можно пересчитать нумерацию по id.
Если же значение num повторяется подряд более одного раза, то LAG, возможно, не поможет,
и нужно будет искать интервалы непрерывности num, длина которых больше 1, о чем несколько сумбурно сказал Владислав Колосов ( 22387187 ).

5. Не нужно думать, что ТС привел таблицу в которой хранятся реальные данные.
Если какая либо строка удаляется: значит она не должна рассматриваться. В понятии юзера, смотрящего на результат выборки: нет понятия 5, null. Как говаривали Вам выше: 22387163 и 22387184 . Вот, млин, пользователь удивится работе вашей программы
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106581
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT *
INTO #A
  FROM (VALUES (1, 3), (2, 2), (3, 5), (4, 2), (5, 2), (6, 2), (7, 5), (8, 3) ) AS T(id, num);

DELETE FROM #A
 WHERE id = 5;

WITH cte
     AS (SELECT *, 
                LAG(num) OVER(ORDER BY id) AS lstNum
           FROM #A AS a)
     SELECT *
       FROM cte
      WHERE lstnum = num;

DROP TABLE #A;



P.S. Если прошлое значение = NULL, то оно не подпадает под условие дубля прошлой записи.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106603
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL
Gerasimenko,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT *
INTO #A
  FROM (VALUES (1, 3), (2, 2), (3, 5), (4, 2), (5, 2), (6, 2), (7, 5), (8, 3) ) AS T(id, num);

DELETE FROM #A
 WHERE id = 5;

WITH cte
     AS (SELECT *, 
                LAG(num) OVER(ORDER BY id) AS lstNum
           FROM #A AS a)
     SELECT *
       FROM cte
      WHERE lstnum = num;

DROP TABLE #A;



P.S. Если прошлое значение = NULL, то оно не подпадает под условие дубля прошлой записи.
А где Null? Это так считает Wlr-l. Строка удалена: ее нет.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106611
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,

Не понимаю вопроса. Мой запрос вернет автору то, что он просит.
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106649
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Идущие подряд" дубли, начиная со второго в каждой серии
Код: sql
1.
2.
3.
4.
5.
with src as (select * from (values (1, 3),(2, 2),(3, 5),(4, 2),(5, 2),(6, 5),(7, 3),(8, 3),(9,3),(10,3))z (id, num))
, t1 as (select *, row_number() over (order by src.id) as Serial_1 from src)
, t2 as (select *, row_number() over (partition by t1.num order by t1.id) Serial_2 from t1)
, t3 as (select *, t2.Serial_1 - t2.Serial_2 as diff, row_number() over (partition by t2.num, t2.Serial_1 - t2.Serial_2 order by id) Serial_3 from t2)
select id, num from t3 where t3.Serial_3 > 1

...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106656
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Uridian,

22387638 дает то же самое, но гораздо проще
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40106868
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
godsql
почему нет?
В цитате "того же результирующего набора". А у автора таблица.
То есть автор должен сказать, как определяется очерёдность записей в результирующем наборе, тогда ответить на вопрос можно.
Massa52 предположил, что набор упорядочен по id, но это может быть и не так.

а в чем проблема то? в упорядочивании? ну так поставьте стандартное LAG () OVER (order by 1/0)
:)

PS. что-то тема стала напоминать разговоры после 3 стакана водки :) в студенческие времена
...
Рейтинг: 0 / 0
Найти дубль но только если он дублирует предыдущую строку
    #40107039
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql
alexeyvg
пропущено...
В цитате "того же результирующего набора". А у автора таблица.
То есть автор должен сказать, как определяется очерёдность записей в результирующем наборе, тогда ответить на вопрос можно.
Massa52 предположил, что набор упорядочен по id, но это может быть и не так.

а в чем проблема то? в упорядочивании? ну так поставьте стандартное LAG () OVER (order by 1/0)
:)

PS. что-то тема стала напоминать разговоры после 3 стакана водки :) в студенческие времена


угу, если не различать "того же результирующего набора. А у автора таблица."

И сам ТС куда-то исчез
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти дубль но только если он дублирует предыдущую строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]