sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo obtener el segundo registro de valor más alto al más bajo en función del orden por campo en PostgreSQL

Hay muchas formas de hacerlo, pero si tiene ganas de jugar con las funciones de la ventana, puede RANK() o DENSE_RANK() los pesos por id y eliminar los primeros rangos en una 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;

Demostración:db<>fiddle