PostgreSQL: объединение результатов двух запросов по ключевым полям

Задача: есть две таблицы, из которых получаются данные сгруппированные по городу и населенному пункту. Необходимо их объединить в один результирующий запрос

Решение: оказывается вполне возможно объединить две выборки посредством LEFT/INNER JOIN. Если схематично, то примерно так:

select
    s1.cnt_all,s2.cnt_no,s1.city,s1.settler
from (select * from aaa) as s1
inner join ((select * from bbb) as s2) on (s1.city=s2.city and s1.settler=s2.settler)

Ну или мой результирующий:

select 
	s1.cnt_all,
	case when s2.cnt_pilot is null then 0 else s2.cnt_pilot end as cnt_pilot, 
	s1.city,
	s1.settler 
from (
	SELECT 
		count(posting_addresses.id) as cnt_all,
		ls_addresses.city,
		ls_addresses.settler 
	FROM posting_addresses
		inner join ls_addresses on ls_addresses.ls=posting_addresses.ls and ls_addresses.address_type=1
		inner join divisions on divisions.area=ls_addresses.area and divisions.id=12	
	where posting_addresses.period='2026-01-01'  
	group by
		ls_addresses.city,
		ls_addresses.settler
	order by cnt_all desc
) as s1
left join (
SELECT 
	count(refusals.id) as cnt_pilot,
	ls_addresses.city,
	ls_addresses.settler 
FROM refusals 
inner join ls_addresses on ls_addresses.ls=refusals.ls and ls_addresses.address_type=1
inner join divisions on divisions.area=ls_addresses.area and divisions.id=12 
where refusals.dt ='2026-01-01'  
group by
	ls_addresses.city,
	ls_addresses.settler
order by cnt_pilot desc
) as s2 on (s1.city=s2.city and s1.settler=s2.settler)

SQL: удаление дублей записей в таблице

Ну задача написания нужного запроса сводится к следующим шагам:

  1. Сделаем выборку записей, сгруппировав по дублирующемуся полю. Получим количество дублей, и максимальный id дубля (чтобы знать какой удалять)
  2. Если количество записей больше 1, то запись с максимальным id удалим

В итоге запрос может получится примерно таким:

delete from ls_indications where id in (
	select max_id from (
		select count(ls) as cnt,max(id) as max_id from ls_indications where period='2025-03-01' group by ls
	) as zxc where zxc.cnt>1	
)

P.S. Если дублей больше 2-х, то запрос нужно выполнить несколько раз, т.к. он удаляет за один раз только одну дублирующуюся запись. Можно конечно наваять скрипт, который этот недостаток убирает, но смысла обычно нет, проще запрос выполнить несколько раз

Вложеный запрос в процедуре MySQL, курсоры и прочие прелести

Оставляю код процедуры для «истории».




Еще один полезный SQL запрос для Zabbix

Получение триггеров с учетом зависимостей. Т.е. Если некий тригер А зависит от триггера Б, то его в списке не будет.