PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter o segundo registro de valor mais alto para o mais baixo com base na ordem por campo no PostgreSQL


Há muitas maneiras de fazer isso, mas se você quiser brincar com as funções da janela, você pode RANK() ou DENSE_RANK() os pesos por id e elimine as primeiras classificações em uma consulta externa:
WITH cte AS (
  SELECT id, ('{user,'||index-1||'}')::text[] as json_path, (value->'user_weight')::text::numeric AS weight
  FROM user_table, jsonb_array_elements(json_field->'user')
  WITH ordinality arr(value, index) 
  WHERE arr.value->>'user_name' IN ('Devang', 'Meet') 
  ORDER BY id, value->'user_weight' DESC
) 
SELECT * FROM (
  SELECT cte.*, 
    RANK() OVER (PARTITION BY id ORDER BY id,weight DESC
                 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS r
  FROM cte) j
WHERE r > 1;

Demonstração:db<>fiddle