sql >> Database >  >> RDS >> PostgreSQL

Hoe u de op één na hoogste naar de laagste waarde kunt krijgen op basis van het veld op volgorde in PostgreSQL

Er zijn veel manieren om dit te doen, maar als je zin hebt om met vensterfuncties te spelen, kun je RANK() of DENSE_RANK() de wegingen op id en elimineer de eerste rangen in een buitenste zoekopdracht:

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. Is "Waar IN" met meerdere kolommen gedefinieerd in Standard SQL?

  2. Waarom is het mogelijk om numerieke tekenreekswaarden te gebruiken om integer-velden in MySQL in te stellen, en is dit een functie die altijd zal werken?

  3. Functie wordt sneller uitgevoerd zonder STRIKTE modifier?

  4. aanvulling formule oracle sql query