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

Откуда:
Сообщений: 108
Добрый день.
Очень нужна помощь.
Есть такой запрос:
with x_cnt as (
select eah.orponid as gid
, count(*) over(partition by replace(eaa.orponid||' '||COALESCE(lower(eah.housenum), '')||COALESCE(lower(eah.buildnum),'')||COALESCE(lower(eah.strucnum), ''),' ',' ')) as cnt
from public.ent_as_house eah
left join public.ent_as_addrobj eaa on eah.parent_id = eaa.id
where 1=1
and eah.livestatus = 1
and eah.mrf_id = 354858661
and eah.parent_id is not null
)
Этот запрос выдает идентификаторы eah.orponid адресов, которые являются дублями. Как из этих адресов выбрать только те пары или тройки дублей, в которых хотя бы у одного адреса дата создания (eah.create_date) больше какой-то даты, например, 01.06.2021?

То есть должны остаться такие адреса:
ID Адрес Дата создания
1 Волокамск, ул. Свободы д. 1 01-05-2019
2 Волокамск, ул. Свободы стр. 1 01-06-2021
3 Ипатово, ул. Доватора д. 68а 05-02-2015
4 Ипатово, ул. Доватора д. 68а 02-06-2021
9 июн 21, 08:00    [22333134]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
Кесарь
Member

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


with x_cnt as (
select eah.orponid as gid
, count(*) over(partition by replace(eaa.orponid||' '||COALESCE(lower(eah.housenum), '')||COALESCE(lower(eah.buildnum),'')||COALESCE(lower(eah.strucnum), ''),' ',' ')) as cnt
from public.ent_as_house eah
left join public.ent_as_addrobj eaa on eah.parent_id = eaa.id
where 1=1
and eah.livestatus = 1
and eah.mrf_id = 354858661
and eah.parent_id is not null
)
Этот запрос выдает идентификаторы eah.orponid адресов, которые являются дублями. Как из этих адресов выбрать только те пары или тройки дублей, в которых хотя бы у одного адреса дата создания (eah.create_date) больше какой-то даты, например, 01.06.2021?


1. Прочитайте правила оформления постов. Никто не обязан вам тут помогать, правильно оформленный пост - это элементарное уважение к окружающим. Которые это оценят.


2. Как-то так (не отлаживал)

with x_cnt as (
    select
      eah.orponid as gid,
      eah.create_date,
      count(*) over(partition by replace(eaa.orponid||' '||COALESCE(lower(eah.housenum), '')
||COALESCE(lower(eah.buildnum),'')||COALESCE(lower(eah.strucnum), ''),'  ',' ')) as cnt,
      DENSE_RANK() over(partition by replace(eaa.orponid||' '||COALESCE(lower(eah.housenum), '')
||COALESCE(lower(eah.buildnum),'')||COALESCE(lower(eah.strucnum), ''),'  ',' ')) as rank
    from public.ent_as_house eah
      left join public.ent_as_addrobj eaa on eah.parent_id = eaa.id
    where eah.livestatus = 1
       and eah.mrf_id = 354858661 
       and eah.parent_id is not null )

select *
from x_cnt as src
  cross apply (select top (1) 1
                    from x_cnt src2
                    where src2.rank = src.rank
                      and src2.create_date >= @SearchDate) f
where src.cnt > 1



3. Какой смысл несла конструкция "where 1=1"?

Сообщение было отредактировано: 9 июн 21, 12:56
9 июн 21, 13:04    [22333248]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3799
Кесарь
Какой смысл несла конструкция "where 1=1"
"динамический" запрос с параметрами,
когда нет параметров - остается 1=1, чтобы не убирать WHERE из "конструктора запроса"
9 июн 21, 16:41    [22333410]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
Кесарь
Member

Откуда:
Сообщений: 653
Alex_Ustinov
Кесарь
Какой смысл несла конструкция "where 1=1"
"динамический" запрос с параметрами,
когда нет параметров - остается 1=1, чтобы не убирать WHERE из "конструктора запроса"


Ничего себе! АИ оказывается уже близок, как никогда!


Что это за конструктор, что умеет собирать такие запросы?!
9 июн 21, 16:55    [22333425]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1398
Кесарь,

Скорее всего веб-форма, где пользователь выбирает фильтры из combobox/checkbox/textbox, далее генерируется sql. Это нормальная практика с ипользованием 1=1
10 июн 21, 07:30    [22333567]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
Кесарь
Member

Откуда:
Сообщений: 653
VSVLAD
Кесарь,

Скорее всего веб-форма, где пользователь выбирает фильтры из combobox/checkbox/textbox, далее генерируется sql. Это нормальная практика с ипользованием 1=1


Ну это понятно, просто я не мог предположить, что у нас такие уже все умные, что научились делать генераторы с cte и оконными функциями.

Обычные генераторы генерят такую лютую кондовую хрень, что на неё без слёз взглянуть нельзя. И ВСЁ НЕПРЕМЕННО ЗАГЛАВНЫМИ БУКВАМИ.


Здесь же больше похоже на случай, что код достали из генератора, а потом допиливают руками. Поэтому я и спросил участника, понимает ли она, что делает.


P.S. Кстати что-то она не отвечает. Нехорошо, люди стараются, помогают.
10 июн 21, 11:40    [22333661]     Ответить | Цитировать Сообщить модератору
 Re: Как из выборки with сделать дополнительную выборку  [new]
mnbvcx
Member

Откуда:
Сообщений: 285
"3. Какой смысл несла конструкция "where 1=1"?"
Кесарь, обычное дело писать такое, если запустить запрос и нужно закомментировать следующую строку в WHERE, нопремер

WHERE 1 = 1 
--and x.rn <= (case when z.modelid is null then @n else 1 end)
and coalesce(x.OnlyT0,0) = 0

ЗЫ Код не из продакшна, если чо
11 июн 21, 07:41    [22334160]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить