PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да получите запис от втората най-висока до най-ниска стойност въз основа на ред по поле в PostgreSQL

Има много начини да го направите, но ако искате да си играете с функциите на прозореца, можете да RANK() или DENSE_RANK() теглата по id и елиминирайте първите редове във външна заявка:

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;

Демо:db<>fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL деление на нула при поръчка

  2. Postgresql - Създаване на база данни и таблица динамично

  3. Свържете pyodbc към Postgres

  4. използвайте try/освен с psycopg2 или със затваряне?

  5. извикване на SQL функция в R функция