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

Откуда:
Сообщений: 22
Добрый вечер, друзья!

Столкнулся с задачей, ответ на которую лежит явно на поверхности,
но знаний не хватает..

Может кто пособит?

Есть база объявлений, в которой многие объявления являются
почти клонами.

Если у объявления менялась цена, то это уже новое объявление.
Общее у них - последние 20 символов URL

Вот такой набор получается:

       Short_url		Дата#объявления 

z-zubrenok_800770331	2017-06-18 00:00:00.000
z-zubrenok_800770331	2017-06-19 00:00:00.000
z-zubrenok_333979749	2016-11-15 00:00:00.000
z-zubrenok_333979749	2016-10-15 00:00:00.000
z-zubrenok_333979749	2017-01-18 00:00:00.000
z-zubrenok_333979749	2016-10-20 00:00:00.000
zzubrenok_1106097334	2017-06-18 00:00:00.000
zzubrenok_1106097334	2017-06-16 00:00:00.000
zzubrenok_1106097334	2017-06-19 00:00:00.000
zzubrenok_1106097334	2017-06-15 00:00:00.000
z-zernovoz_999686501	2017-07-03 00:00:00.000
z-zernovoz_999686501	2017-07-05 00:00:00.000


Так вот задача - выбрать самое последнее по дате объявление, чтобы получилось вот так:

       Short_url		Дата#объявления 

z-zubrenok_800770331	2017-06-19 00:00:00.000
z-zubrenok_333979749	2017-01-18 00:00:00.000
zzubrenok_1106097334	2017-06-19 00:00:00.000
z-zernovoz_999686501	2017-07-05 00:00:00.000




Недолго поискав решение, нашел вот такой код:

SELECT s1.id, s1.url, s1.год, s1.город, Дата#объявления 
                         FROM  [ExcelAnalysis].[dbo].[clearDB] s1 
                         LEFT JOIN [ExcelAnalysis].[dbo].[clearDB] s2 
                         ON  RIGHT(s1.url, 20) = RIGHT(s2.url, 20) AND s2.Дата#объявления > s1.Дата#объявления 
                         WHERE s2.ID Is Null


Запрос отработал и выдал результат 1821000 записей

Поскольку фактически задача - это удаление дублей по признаку RIGHT(s1.url, 20),
то в качестве контроля я запустил такой код

SELECT DISTINCT RIGHT(url, 20) AS shURL 
                         FROM  [ExcelAnalysis].[dbo].[clearDB]




Результат 2871000 записей

Значит код похоже с изъяном.

Не сочтите за труд, друзья, поправьте меня, где я не прав.

Заранее благодарен.

p.s. всего записей 3,7 млн
13 июл 17, 21:38    [20642476]     Ответить | Цитировать Сообщить модератору
 Re: Отбор из дублей по максимальной дате  [new]
londinium
Member

Откуда: Киев
Сообщений: 1139
Maximusu,

WITH CTE(ZUBRENOK,RDATE) AS
(
  SELECT 'z-zubrenok_800770331',	'2017-06-18 00:00:00.000'
   UNION ALL

SELECT 'z-zubrenok_800770331',	'2017-06-19 00:00:00.000'
 UNION ALL
SELECT 'z-zubrenok_333979749',	'2016-11-15 00:00:00.000'
UNION ALL
SELECT'z-zubrenok_333979749',	'2016-10-15 00:00:00.000'
UNION ALL
SELECT'z-zubrenok_333979749',	'2017-01-18 00:00:00.000'
UNION ALL
SELECT'z-zubrenok_333979749',	'2016-10-20 00:00:00.000'
UNION ALL
SELECT'zzubrenok_1106097334',	'2017-06-18 00:00:00.000'
UNION ALL
SELECT'zzubrenok_1106097334',	'2017-06-16 00:00:00.000'
UNION ALL
SELECT'zzubrenok_1106097334',	'2017-06-19 00:00:00.000'
UNION ALL
SELECT'zzubrenok_1106097334',	'2017-06-15 00:00:00.000'
UNION ALL
SELECT'z-zernovoz_999686501',	'2017-07-03 00:00:00.000'
UNION ALL
SELECT'z-zernovoz_999686501',	'2017-07-05 00:00:00.000'
)
SELECT C.ZUBRENOK,C.RDATE,
ROW_NUMBER()OVER(PARTITION BY C.ZUBRENOK ORDER BY C.RDATE DESC)XCOL
FROM CTE C
13 июл 17, 21:56    [20642508]     Ответить | Цитировать Сообщить модератору
 Re: Отбор из дублей по максимальной дате  [new]
Maximusu
Member

Откуда:
Сообщений: 22
londinium,

Конструкция огонь!
Все сработало в лучшем виде, огромное спасибо

Даже спрашивать не буду, как оно так отработало :/
Пошел учить матчасть
13 июл 17, 23:17    [20642653]     Ответить | Цитировать Сообщить модератору
 Re: Отбор из дублей по максимальной дате  [new]
Добрый Э - Эх
Guest
Maximusu,

ещё пара способов, для расширения кругозора...
14 июл 17, 04:13    [20642806]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить