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

Откуда: Москва
Сообщений: 496
Ребят, подскажите идею как сделать.
Есть строчки, разница у них в датах от до.
Как убрать дубликаты есть период идет по порядку.

К сообщению приложен файл. Размер - 12Kb
25 сен 17, 16:51    [20821323]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
lag(), lead(), over()
25 сен 17, 16:58    [20821342]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Дедушка
lag(), lead(), over()


забыл уточнить сервер 2008 R
25 сен 17, 17:03    [20821358]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
iii2
Member

Откуда:
Сообщений: 202
В такой постановке - группировка по первым трем полям, min - по первой дате, max - по второй.
25 сен 17, 17:51    [20821533]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
iii2
В такой постановке - группировка по первым трем полям, min - по первой дате, max - по второй.

если бы задачу можно было бы так решить, я бы сюда не писал.
26 сен 17, 10:11    [20822692]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Добрый Э - Эх
Guest
Focha,

инвариант группы. ROW_NUMBER вполне себе доступен с 2005-й версии сервера.
26 сен 17, 10:15    [20822702]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Focha
iii2
В такой постановке - группировка по первым трем полям, min - по первой дате, max - по второй.

если бы задачу можно было бы так решить, я бы сюда не писал.
Напишите задачу внятно. Дубликаты по каким именно полям нужно убрать? Что такое "период идёт по порядку"?
26 сен 17, 10:25    [20822746]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Добрый Э - Эх
Focha,

инвариант группы. ROW_NUMBER вполне себе доступен с 2005-й версии сервера.

и? чем мне поможет ROW_NUMBER?
26 сен 17, 10:25    [20822752]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Добрый Э - Эх
Guest
Focha,

по ссылкам походи-почитай. там все написано.
26 сен 17, 10:27    [20822760]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Откуда old_retail_price 6390 ?
26 сен 17, 10:27    [20822762]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Focha
пропущено...

если бы задачу можно было бы так решить, я бы сюда не писал.
Напишите задачу внятно. Дубликаты по каким именно полям нужно убрать? Что такое "период идёт по порядку"?


На картинке видно первые 3 строчки отличаются только периодом, который идет по порядку, я бы хотел убрать строки где артикул, цена текущая, цена старая совпадают и даты последовательны, все было бы легко, если бы тоже самое (артикул/цены) не дублировались в другой период. 5 строка
26 сен 17, 10:29    [20822769]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Откуда old_retail_price 6390 ?

спасибо что вы очень внимательны. делал пример, и забыл подправить цену.

К сообщению приложен файл. Размер - 12Kb
26 сен 17, 10:31    [20822783]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Focha
Dmitry V. Liseev
пропущено...
Напишите задачу внятно. Дубликаты по каким именно полям нужно убрать? Что такое "период идёт по порядку"?


На картинке видно первые 3 строчки отличаются только периодом, который идет по порядку, я бы хотел убрать строки где артикул, цена текущая, цена старая совпадают и даты последовательны, все было бы легко, если бы тоже самое (артикул/цены) не дублировались в другой период. 5 строка
Пронумеровать строки с помощью ROW_NUMBER(), при этом отсортировав по первой дате или по второй, без разницы. Так появится понятие "предыдущая/следующая строка".
SELECT ROW_NUMBER() OVER(ORDER BY date_from) RowNumber, *
INTO #tmp
FROM table
Затем найти строки, где "артикул, цена текущая, цена старая" отличаются от предыдущей строки хоть в одном поле или предыдущая строка отсутствует.
FROM
   #tmp this
   LEFT JOIN #tmp prev ON prev.RowNumber = this.RowNumber - 1
WHERE prev.RowNumber IS NULL OR prev.... <> this.... (тут поля, по которым группируем)
26 сен 17, 10:39    [20822847]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Focha
пропущено...


На картинке видно первые 3 строчки отличаются только периодом, который идет по порядку, я бы хотел убрать строки где артикул, цена текущая, цена старая совпадают и даты последовательны, все было бы легко, если бы тоже самое (артикул/цены) не дублировались в другой период. 5 строка
Пронумеровать строки с помощью ROW_NUMBER(), при этом отсортировав по первой дате или по второй, без разницы. Так появится понятие "предыдущая/следующая строка".
SELECT ROW_NUMBER() OVER(ORDER BY date_from) RowNumber, *
INTO #tmp
FROM table
Затем найти строки, где "артикул, цена текущая, цена старая" отличаются от предыдущей строки хоть в одном поле или предыдущая строка отсутствует.
FROM
   #tmp this
   LEFT JOIN #tmp prev ON prev.RowNumber = this.RowNumber - 1
WHERE prev.RowNumber IS NULL OR prev.... <> this.... (тут поля, по которым группируем)



понял идею, сейчас попробую.
26 сен 17, 10:46    [20822891]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Focha
пропущено...


На картинке видно первые 3 строчки отличаются только периодом, который идет по порядку, я бы хотел убрать строки где артикул, цена текущая, цена старая совпадают и даты последовательны, все было бы легко, если бы тоже самое (артикул/цены) не дублировались в другой период. 5 строка
Пронумеровать строки с помощью ROW_NUMBER(), при этом отсортировав по первой дате или по второй, без разницы. Так появится понятие "предыдущая/следующая строка".
SELECT ROW_NUMBER() OVER(ORDER BY date_from) RowNumber, *
INTO #tmp
FROM table
Затем найти строки, где "артикул, цена текущая, цена старая" отличаются от предыдущей строки хоть в одном поле или предыдущая строка отсутствует.
FROM
   #tmp this
   LEFT JOIN #tmp prev ON prev.RowNumber = this.RowNumber - 1
WHERE prev.RowNumber IS NULL OR prev.... <> this.... (тут поля, по которым группируем)


Спасибо, за идею, это то что нужно. :)
26 сен 17, 11:13    [20823033]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Focha
Dmitry V. Liseev
пропущено...
Пронумеровать строки с помощью ROW_NUMBER(), при этом отсортировав по первой дате или по второй, без разницы. Так появится понятие "предыдущая/следующая строка".
SELECT ROW_NUMBER() OVER(ORDER BY date_from) RowNumber, *
INTO #tmp
FROM table
Затем найти строки, где "артикул, цена текущая, цена старая" отличаются от предыдущей строки хоть в одном поле или предыдущая строка отсутствует.
FROM
   #tmp this
   LEFT JOIN #tmp prev ON prev.RowNumber = this.RowNumber - 1
WHERE prev.RowNumber IS NULL OR prev.... <> this.... (тут поля, по которым группируем)


Спасибо, за идею, это то что нужно. :)
Можно обойтись без отдельной временной таблицы, если нумерацию строк запихать в обобщенное табличное выражение.
26 сен 17, 11:23    [20823120]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Focha
пропущено...


Спасибо, за идею, это то что нужно. :)
Можно обойтись без отдельной временной таблицы, если нумерацию строк запихать в обобщенное табличное выражение.


Дмитрий, да я так и делаю. Временная таблица проверять удобней.
А как убрать если строка 3 раза повторяется.

У меня пока получается получить то что нужно через курсор.
26 сен 17, 12:11    [20823344]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Focha
Dmitry V. Liseev
пропущено...
Можно обойтись без отдельной временной таблицы, если нумерацию строк запихать в обобщенное табличное выражение.


Дмитрий, да я так и делаю. Временная таблица проверять удобней.
А как убрать если строка 3 раза повторяется.

У меня пока получается получить то что нужно через курсор.
Идея в том, чтобы вывести строку только в том случае, если она отличается от предыдущей. Не важно, сколько раз она повторяется.
26 сен 17, 12:17    [20823366]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
Dmitry V. Liseev
Focha
пропущено...


Дмитрий, да я так и делаю. Временная таблица проверять удобней.
А как убрать если строка 3 раза повторяется.

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


ок вывел, а дальше? я перебираю курсором, может есть какой то другой подход?
26 сен 17, 12:20    [20823372]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Focha
ок вывел, а дальше? я перебираю курсором, может есть какой то другой подход?
подзапрос, соединение таблицы на себя со сдвигом по вашей "нумерации"...
26 сен 17, 12:27    [20823401]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Focha
Dmitry V. Liseev
пропущено...
Идея в том, чтобы вывести строку только в том случае, если она отличается от предыдущей. Не важно, сколько раз она повторяется.


ок вывел, а дальше? я перебираю курсором, может есть какой то другой подход?

а что же вы дальше то хотите?
26 сен 17, 12:28    [20823407]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Focha
Dmitry V. Liseev
пропущено...
Идея в том, чтобы вывести строку только в том случае, если она отличается от предыдущей. Не важно, сколько раз она повторяется.


ок вывел, а дальше? я перебираю курсором, может есть какой то другой подход?
В исходном посте было только про убирание дубликатов. Мы же не знаем, что Вы дальше хотите.
26 сен 17, 12:36    [20823450]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
уважаемые друзья.
Спасибо за ваши идеи, перебор курсором оказалось достаточно (сразу не подумал, а идея Дмитрия мне подсказала)
178 000 строк, сократились до 120 000 ~30%.
26 сен 17, 12:38    [20823455]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
всем спасибо за просмотр новой серии журнала "деградант"
26 сен 17, 12:40    [20823461]     Ответить | Цитировать Сообщить модератору
 Re: убрать дубликаты и взять начальную и конечную дату, но строка может повториться  [new]
Focha
Member

Откуда: Москва
Сообщений: 496
TaPaK
всем спасибо за просмотр новой серии журнала "деградант"

сожалею, что вы читаете такие журналы.
26 сен 17, 13:28    [20823671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить