powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по дубликатам
5 сообщений из 5, страница 1 из 1
Вопрос по дубликатам
    #40039261
polister67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Я в sql новичок и собственно получил простую, как мне сказали задачу.. Обработать справочник с 1 млн. записей: суть моей задачи в том, чтобы найти дубликаты записей и присвоить им ID оригинальной записи, то есть например:

id 1 - Магазин - ул. Ленина - д. 77 - n_id
id 2 - Магазин - Ленина ул. - д. 77 - n_id
id 3 - Жилой дом - 1 мая - д.3 - n_id
id 4 - Аптека - пр. Октября - д.9 - n_id
id 5 - Магазин - улица Ленина - д. 77 - n_id
id 6 - Остановка об.транспорта - ул. Московская - д.21 - n_id
...
...
...
...и так до миллиона.

Собственно мы видим, что id 1, 2, 5 - являются дубликатами. Мне нужно сделать так чтобы например id 1 - оставался без n_id, а у id 2, 5 - n_id = id 1 и так у всех встречающихся дубликатов в таблице. То есть дальше таблица должна бы была выглядеть так:

id - тип - улица - дом - n_id
id 1 - Магазин - ул. Ленина - д. 77 - n_id
id 2 - Магазин - Ленина ул. - д. 77 - n_id 1
id 3 - Жилой дом - 1 мая - д.3 - n_id
id 4 - Аптека - пр. Октября - д.9 - n_id
id 5 - Магазин - улица Ленина - д. 77 - n_id 1
id 6 - Остановка об.транспорта - ул. Московская - д.21 - n_id
...
...
...
...и так до миллиона.


Пробовал оконными функциями, через count, но не как-то не хватает знаний в sql может, кто знает, как сделать это запросами или это только в ручную..
...
Рейтинг: 0 / 0
Вопрос по дубликатам
    #40039281
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polister67
получил простую, как мне сказали задачу..
нуу, это над тобой зло пошутили :)
задачи связанные с парсингом (а твой случай именно это) "ниразу" не простые

вообщем, тебе нужно будет
- "разбить" на слова поле "улица"
- привести к единому виду все эти "ул.", "улица", "пр.", "проспект", "пер.", ... (для чего нужно будет завести справочник)
- возможно, тоже и для "д.", "дом", "корпус", ... (?)
- "склеить" всё в строку через STRING_AGG с сортировкой
- и только после этого "браться" за "оконные функции" :)
...
Рейтинг: 0 / 0
Вопрос по дубликатам
    #40039303
polister67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court
polister67
получил простую, как мне сказали задачу..
нуу, это над тобой зло пошутили :)
задачи связанные с парсингом (а твой случай именно это) "ниразу" не простые

вообщем, тебе нужно будет
- "разбить" на слова поле "улица"
- привести к единому виду все эти "ул.", "улица", "пр.", "проспект", "пер.", ... (для чего нужно будет завести справочник)
- возможно, тоже и для "д.", "дом", "корпус", ... (?)
- "склеить" всё в строку через STRING_AGG с сортировкой
- и только после этого "браться" за "оконные функции" :)


Подскажи пожалуйста, а вот с назначением id и n_id можешь подсказать поподробнее.. Запрос на примере или может почитать, что про это. Сейчас хотелось бы понять как это можно не сделать не прибегая метода "В ручную"
...
Рейтинг: 0 / 0
Вопрос по дубликатам
    #40039336
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polister67,

вот, очень и очень упрощённо:
- предполагается, что "разночтения" только в поле street
- разделитель слов только пробел

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
with in_data (id,adr_type,street,house) as (
  select 1, 'Магазин', 'ул. Ленина', 'д. 77' union all
  select 2, 'Магазин', 'Ленина ул.', 'д. 77' union all
  select 3, 'Жилой дом', '1 мая', 'д.3' union all
  select 4, 'Аптека', 'пр. Октября', 'д.9' union all
  select 5, 'Магазин', 'улица Ленина', 'д. 77' union all
  select 6, 'Остановка об.транспорта', 'ул. Московская', 'д.21'
),
dict_street (e, v) as (
  select 'улица', 'улица' union all
  select 'улица', 'ул.' union all
  select 'улица', 'ул' union all
  select 'проспект', 'проспект' union all
  select 'проспект', 'пр.'
  --	... и т.д.
  	
),
pars as (
	select id, adr_type, house,
		unnest(string_to_array(street, ' ')) s
	from in_data
),
agg as (
	select id, adr_type, house, 
    	    string_agg(coalesce(b.e, a.s), '#' order by s) as s1
	from pars a left join dict_street b on a.s = b.v  
        group by id, adr_type, house
),
res as (
	select 
    	    *
            ,dense_rank()over(order by adr_type, house, s1) as inv 
        from agg
)
select 
	*
    ,min(id)over(partition by inv) as n_id 
from res
order by id 



idadr_typehouses1invn_id1Магазинд. 77Ленина#улица312Магазинд. 77Ленина#улица313Жилой домд.31#мая234Аптекад.9Октября#проспект145Магазинд. 77Ленина#улица316Остановка об.транспортад.21Московская#улица46
...
Рейтинг: 0 / 0
Вопрос по дубликатам
    #40039403
polister67
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, большое тебе спасибо))
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос по дубликатам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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