sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan får du den næsthøjeste til laveste værdipost baseret på rækkefølge efter felt i PostgreSQL

Der er mange måder at gøre det på, men hvis du har lyst til at lege med vinduesfunktioner kan du RANK() eller DENSE_RANK() vægtene efter id og eliminer de første rækker i en ydre forespørgsel:

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



  1. Tips til overvågning af MariaDB-replikering med ClusterControl

  2. Hent sidst kendte værdi for hver kolonne i en række

  3. SQL Server og huller i en identitetskolonne

  4. Hvordan får man det samlede antal fundne rækker uden at overveje grænsen i BOB?