powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос по поиску дублей
6 сообщений из 6, страница 1 из 1
Запрос по поиску дублей
    #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
Запрос по поиску дублей
    #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
Запрос по поиску дублей
    #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
Запрос по поиску дублей
    #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
Запрос по поиску дублей
    #39147871
Max K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо Марк.
Именно то что нужно. Мои эксперименты не удавалась т.к. не знал что можно делать подсчет (count) по уже схлопнутым значениям distinct... Нашел 12 тысяч дублей в базе, пойду разбираться кто виноват ...
Еще раз спасибо.
...
Рейтинг: 0 / 0
Запрос по поиску дублей
    #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
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Запрос по поиску дублей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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