WITH inactive_connections AS (
SELECT
pid,client_addr,
RANK ( ) OVER ( PARTITION BY client_addr ORDER BY backend_start ASC ) AS RANK
FROM
pg_stat_activity
WHERE
pid <> pg_backend_pid ( )
AND
application_name !~ '(?:psql)|(?:pgAdmin.+)'
AND
datname = current_database ( )
AND
usename = CURRENT_USER
AND
STATE IN ( 'idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled' )
AND
CURRENT_TIMESTAMP - state_change > INTERVAL '5 minutes'
)
SELECT
pg_terminate_backend ( pid )
FROM
inactive_connections
WHERE
RANK > 1