PostgreeSQL: контроль уникальности вставки

Хороший вариант: возложить контроль уникальности вставляемых данных, на уровень БД. Если это по каким-то причинам не возможно, то можно попробовать такой вариант:

insert into users_groups_filling (user_id,user_group) 
select  :user_id,:user_group 
where 
 NOT EXISTS (
	 SELECT id from users_groups_filling where user_id=:user_id and user_group=:user_group
 )

PostgreeSQL: INSERT or UPDATE в запросе

В Postgree очень удобно реализовывать механизм защиты от избыточной вставки одинаковых значений.

  1. Назначаем на колонки таблицы контроль уникальности
 CONSTRAINT control_un_key UNIQUE (dtfrom_utc)
        INCLUDE(tar_id,user_group),

2. Далее при вставке достаточно указать что то в духе:

INSERT INTO tars_list
                ( dtfrom_utc, tar_id, user_group)
         VALUES (:dtfrom_utc,:tar_id,:user_group) ON CONFLICT  DO NOTHING

Одно плохое НО. Проверка уникальности не будет работать, если в полях есть null

SQL: выборка последних значений по дате из БД

Задача: в таблице хранятся тарифы «сплошным навалом», необходимо вытащить последние значения всех тарифов.

Решение:

select 
reg_tarifs.date as dttime,
reg_tarifs.tarif as tarif,
reg_tarifs.zone as zone_num,
enum_zones.name as tarzone
from reg_tarifs
inner join enum_zones on enum_zones.id=reg_tarifs.zone
inner join 
(select 
  max(date) as maxdt,zone 
from reg_tarifs
where ezs=5
group by  zone 
) as max
on max.maxdt=reg_tarifs.date and max.zone=reg_tarifs.zone

PostgreSQL: расстояние между двумя координатами в метрах

Можно добавить функцию вида:

CREATE OR REPLACE FUNCTION public.distance(
	lat1 double precision,
	lon1 double precision,
	lat2 double precision,
	lon2 double precision)
    RETURNS double precision
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
    R integer = 6371e3; -- Метры
    rad double precision = 0.01745329252;

    f1 double precision = lat1 * rad;
    f2 double precision = lat2 * rad;
    df double precision = (lat2-lat1) * rad;
    dl double precision = (lon2-lon1) * rad;

    a double precision = sin(df/2) * sin(df/2) + cos(f1) * cos(f2) * sin(dl/2) * sin(dl/2);
    c double precision = 2 * atan2(sqrt(a), sqrt(1-a));    
BEGIN                                                     
    RETURN R * c;        
END
$BODY$;

PostGree: удаление всех таблиц в БД

Самый простой способ, в консоли зайти в БД и выполнить скрипт:

DO $$ DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;