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

Откуда:
Сообщений: 70
Добрый день.
Есть такой запрос:
select
ph.orponid as GlobalID
, sys.external_id as "HouseID"
, ph.adr_adm_ter as "Адрес"
from
edw_prod.edw_ods.t_000148_ent_as_house ph
JOIN edw_prod.edw_ods.t_000148_ent_id_vs_o_add sys on ph.id = sys.house_id and sys.system_id = 354541532

where 1=1
and ph.livestatus = 1
and ph.mrf_id = 354858663--Сибирь
and ph.parent_id is not null
order by ph.orponid;

Как его преобразовать так, чтобы вывести только строки с повторяющимися идентификаторами sys.external_id?
29 дек 18, 05:50    [21776166]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1393
*Ann*,

как вариант (внесенные мною изменения - выделены цветом...):
select * 
  from (
         select ph.orponid as GlobalID
              , sys.external_id as "HouseID"
              , ph.adr_adm_ter as "Адрес"
              , count() over(partition by sys.external_id) as x_cnt
           from edw_prod.edw_ods.t_000148_ent_as_house ph 
           JOIN edw_prod.edw_ods.t_000148_ent_id_vs_o_add sys
             on ph.id = sys.house_id and sys.system_id = 354541532
          where 1=1
            and ph.livestatus = 1
            and ph.mrf_id = 354858663--Сибирь
            and ph.parent_id is not null
       ) v
 where x_cnt > 1
 order by GlobalID;
29 дек 18, 06:01    [21776170]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1393
Щукина Анна
*Ann*,

как вариант (внесенные мною изменения - выделены цветом...):
select * 
  from (
         select ph.orponid as GlobalID
              , sys.external_id as "HouseID"
              , ph.adr_adm_ter as "Адрес"
              , count(1) over(partition by sys.external_id) as x_cnt
           from edw_prod.edw_ods.t_000148_ent_as_house ph 
           JOIN edw_prod.edw_ods.t_000148_ent_id_vs_o_add sys
             on ph.id = sys.house_id and sys.system_id = 354541532
          where 1=1
            and ph.livestatus = 1
            and ph.mrf_id = 354858663--Сибирь
            and ph.parent_id is not null
       ) v
 where x_cnt > 1
 order by GlobalID;
конечно же, в count-е должно быть хоть что-то ("звездочка", "единица" или в чем вам там считать удобнее ;) )
29 дек 18, 06:02    [21776172]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Щукина Анна,

Большое спасибо за помощь. Работает. Но почему-не анализирует фильтр по системе sys.system_id = 354541532, выдаёт дубли во всех системах.
29 дек 18, 06:57    [21776181]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Щукина Анна,

Ошиблась, все работает. Ещё раз большое спасибо!
29 дек 18, 06:59    [21776183]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Добрый день.
Подскажите еще, пожалуйста, как сделать вывод дублирующих записей по двум столбцам (в моем случае по полям Широта и Долгота).
Вот запрос , который выводит адреса с координатами:
select eah.orponid as GlobalID
, eah.adr_adm_ter as Адрес
, hc.latitude as Широта
, hc.longitude as Долгота
from
CHD.ent_as_house eah LEFT OUTER JOIN chd.house_coordinates hc
on eah.coordinates_id = hc.id
where 1=1
and eah.livestatus = 1
and eah.parent_id is not null
order by eah.orponid;

И я посчитала, что по координатам есть дублирующие записи:
select hc.latitude
, hc.longitude
, count(*)
from public.house_coordinates as hc
group by hc.latitude, hc.longitude
having count(*) > 1

Вот в первом запросе мне надо вывести только дубли. Как это сделать? С over partition by у меня не получилось с двумя столбцами.
11 янв 19, 06:10    [21782370]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1393
*Ann*,

показывайте, как делали...

З.Ы.
Подсказка (не вдаваясь в тонкости терминологии и технические детали): считайте для себя, что в аналитических функциях конструкция "PARTITION BY" - это аналог конструкции "GROUP BY" агрегатного запроса...
Соответственно, если в агрегатном запросе дубли искали через group by hc.latitude, hc.longitude , то и в аналитическом нужно указывать PARTITION BY hc.latitude, hc.longitude
11 янв 19, 06:35    [21782373]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Пробовала по аналогии с предыдущим запросом:
select *
from (
select eah.orponid as GlobalID
, eah.adr_adm_ter as Адрес
, hc.latitude as Широта
, hc.longitude as Долгота
, count() over(partition by hc.latitude, hc.longitude) as x_cnt

from
public.ent_as_house eah LEFT OUTER JOIN public.house_coordinates hc
on eah.coordinates_id = hc.id
where 1=1
and eah.livestatus = 1
and eah.mrf_id =
(select id from public.ent_rf_rtk where name = 'МРФ Центр')
and eah.parent_id is not null
order by eah.orponid
) v
where x_cnt > 1
order by hc.latitude, hc.longitude;

Выдает ошибку ERROR: 42809: count(*) must be used to call a parameterless aggregate function
11 янв 19, 07:08    [21782378]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 280
*Ann*,

, count(*) over(partition by hc.latitude, hc.longitude) as x_cnt
11 янв 19, 07:30    [21782384]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Теперь ошибка missing from-clause entry for table 'hc'.
В from у меня другая таблица. А с hc идёт соединение по left join
11 янв 19, 07:40    [21782387]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
*Ann*
Member

Откуда:
Сообщений: 70
Нашла, в чем была ошибка. Спасибо большое за помощь!
11 янв 19, 09:00    [21782426]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дублей  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4271
Топик Ань.
11 янв 19, 16:27    [21783029]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить