Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос по поиску дублей / 6 сообщений из 6, страница 1 из 1
14.01.2016, 16:04
    #39147458
Max K.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
Доброго дня.
Прошу подсказать как по таблице icmadmin.Table определить дубли элементов.
Основное условие: ищем совпадения по полю BARCODE, при отличных ITEMID. По полю Version - берем только последнюю версию.

BARCODE ITEMID Version
55521DDDDDDDDDD330001 A1004867 1
55521DDDDDDDDDD330001 A1009924 1
55521DDDDDDDDDD330001 A1009979 1
55521DDDDDDDDDD330001 A1009988 1
55521DDDDDDDDDD330001 A1007303 1
55521DDDDDDDDDD330001 A1007303 2
55521DDDDDDDDDD330001 A1007303 3
55521DDDDDDDDDD330001 A1009938 1

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


Т.е. примерно из этого запроса, если по полю Barcode больше одной записи то выводить запись о проблемном Barcode...

SELECT new.ATTR0000001071 BarCode, new.ItemID, count (new.ItemId)
FROM ICMADMIN.ICMUT01021001 new
WHERE new.ATTR0000001071 = '55521DDDDDDDDDD330001' AND new.VERSIONID = (SELECT MAX(old.VERSIONID) FROM ICMADMIN.ICMUT01021001 old WHERE new.ItemID = old.ItemID)
group by new.ATTR0000001071, new.ItemId;


И еще интересно можно ли как-то иначе определять мах версию кроме этой строчки? ( AND new.VERSIONID = (SELECT MAX(old.VERSIONID) FROM ICMADMIN.ICMUT01021001 old WHERE new.ItemID = old.ItemID))
...
Рейтинг: 0 / 0
14.01.2016, 16:56
    #39147546
A.Panskikh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
Max K.,

Сложно понять, что именно нужно. DB2 SQL CookBook очень полезен для изучения.

-- определить записи с дублями

with dups (BarCode, ItemID, cnt, max_Version) as (
SELECT new.ATTR0000001071 BarCode, new.ItemID, count (*), max(Version)
FROM ICMADMIN.ICMUT01021001 new
group by new.ATTR0000001071, new.ItemId
having count (*) > 1
)

-- и выдать все записи с дублями, где версия ниже максимальной

select new.* FROM ICMADMIN.ICMUT01021001 new
inner join dups on (new.ATTR0000001071, new.ItemId)=(dups.ATTR0000001071, dups.ItemId)
where new.Version < dups.max_Version
order by new.ATTR0000001071, new.ItemId
;
...
Рейтинг: 0 / 0
14.01.2016, 17:15
    #39147572
Max K.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
A.Panskikh,
Перефразирую: у меня есть таблица в таком виде:

Barcode ItemID
55521DDDDDDDDDD330001 A1009979 - (уникальная запись)
55521DDDDDDDDDD330001 A1009988 - (уникальная запись)
55521DDDDDDDDDD330001 A1007303 - (уникальная запись)
55521DDDDDDDDDD330001 A1007303 - (дубль, подобная пара Barcode - ItemID уже есть)
55521DDDDDDDDDD330001 A1007303 - (дубль, подобная пара Barcode - ItemID уже есть)
55521DDDDDDDDDD352203 A1002702 - (уникальная запись)
55521DDDDDDDDDD352203 A1002702 - (дубль, подобная пара Barcode - ItemID уже есть)

Нужно её схлопнуть к вот такому виду. Т.е. по полю Barcode должно остаться количество уникальных ItemId
55521DDDDDDDDDD330001 3
55521DDDDDDDDDD352003 1

А затем выкинуть записи где ItemId = 1. Т.е. финальная таблица, которая покажет что для определенного штрихкода у меня 3 уникальных элемента создано:
55521DDDDDDDDDD330001 3


Над предлагаемыми запросами пока думаю...
...
Рейтинг: 0 / 0
14.01.2016, 18:26
    #39147644
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
Max K.,

Добрый день.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select barcode, count(distinct itemid)
from table(values
  ('55521DDDDDDDDDD330001', 'A1009979')
, ('55521DDDDDDDDDD330001', 'A1009988')
, ('55521DDDDDDDDDD330001', 'A1007303')
, ('55521DDDDDDDDDD330001', 'A1007303')
, ('55521DDDDDDDDDD330001', 'A1007303')
, ('55521DDDDDDDDDD352203', 'A1002702') 
, ('55521DDDDDDDDDD352203', 'A1002702')
) t (barcode, itemid)
group by barcode
having count(distinct itemid)>1
...
Рейтинг: 0 / 0
15.01.2016, 08:10
    #39147871
Max K.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
Огромное спасибо Марк.
Именно то что нужно. Мои эксперименты не удавалась т.к. не знал что можно делать подсчет (count) по уже схлопнутым значениям distinct... Нашел 12 тысяч дублей в базе, пойду разбираться кто виноват ...
Еще раз спасибо.
...
Рейтинг: 0 / 0
15.01.2016, 16:14
    #39148359
Max K.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос по поиску дублей
Начал разбираться в причинах дублей и понял что скрипт не полностью удовлетворяет потребностям...
Смысл в том что вначале была 1 карточка с BC01 и ID01, а потом для данного элемента обновили атрибут barcode и у этой карточки появились 2 и 3 версии с BC02 И ID01 .
Затем другой пользователь создал заново карточку с BC01, которой соответственно назначился новый ItemID - ID02 .

В итоге скрипт считает что для BC01 у нас 2 уникальных ItemId, а для BC02 1 уникальный ItemId. Это не правильно.
Нужно оценить только по последней версии, т.е. запрос должен вернуть 2 строки в которых Count = 1.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select barcode, count(distinct itemid) count_ID
from table(values
  ('BC01', 'ID01', '1')
, ('BC02', 'ID01', '2')
, ('BC02', 'ID01', '3')
, ('BC01', 'ID02', '1')
, ('BC01', 'ID02', '2')
) t (barcode, itemid, version)
group by barcode
--having count(distinct itemid)>1;
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос по поиску дублей / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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