PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách lấy bản ghi có giá trị cao thứ hai đến thấp nhất dựa trên thứ tự theo trường trong PostgreSQL

Có nhiều cách để thực hiện, nhưng nếu bạn muốn chơi với các hàm cửa sổ, bạn có thể RANK() hoặc DENSE_RANK() trọng số theo id và loại bỏ các xếp hạng đầu tiên trong một truy vấn bên ngoài:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Để giảm một chỉ mục với psycopg2 có hiệu lực trước hoặc sau khi cam kết?

  2. Trình kích hoạt postgresql:vô hiệu hóa cam kết tự động và đặt mức cô lập

  3. Thư viện ODBC v Libpq:C cho PostgreSQL

  4. Truy vấn SELECT đệ quy để trả về tỷ lệ có độ sâu tùy ý?

  5. Câu lệnh GROUP BY + CASE