PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So erhalten Sie den Datensatz mit dem zweithöchsten bis niedrigsten Wert auf der Grundlage des Felds „Ordnen nach“ in PostgreSQL

Es gibt viele Möglichkeiten, dies zu tun, aber wenn Sie Lust haben, mit Fensterfunktionen zu spielen, können Sie RANK() verwenden oder DENSE_RANK() die Gewichte nach ID und eliminieren die ersten Ränge in einer äußeren Abfrage:

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;

Demo:db<>fiddle