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

Làm cách nào để so sánh hàng hiện tại với hàng tiếp theo và hàng trước đó trong PostgreSQL?

Đây là giải pháp của tôi bằng cách sử dụng WINDOW functions . Tôi đã sử dụng laglead chức năng. Cả hai đều trả về một giá trị từ một cột từ một hàng được bù đắp từ hàng hiện tại. lag quay lại và lead tiếp theo trong phần bù đắp.

SELECT tokcat.text
FROM (
    SELECT text, category, chartype, lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory
    FROM token t, textBlockHasToken tb
    WHERE tb.tokenId = t.id
    WINDOW w AS (
        PARTITION BY textBlockId, sentence
        ORDER BY textBlockId, sentence, position
    )
) tokcat
WHERE 'NAME' = ANY(previousCategory)
AND 'NAME' = ANY(nextCategory)
AND 'NAME' <> ANY(category)

Phiên bản đơn giản hóa:

SELECT text
FROM (
    SELECT text
          ,category 
          ,lag(category) OVER w as previous_cat
          ,lead(category) OVER w as next_cat
    FROM   token t
    JOIN   textblockhastoken tb ON tb.tokenid = t.id
    WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position)
    ) tokcat
WHERE  category <> 'NAME'
AND    previous_cat = 'NAME'
AND    next_cat = 'NAME';

Những điểm chính

  • = ANY() không cần thiết, hàm window trả về một giá trị duy nhất
  • một số trường thừa trong truy vấn con
  • không cần sắp xếp theo cột, mà bạn PARTITION BY - ORDER BY áp dụng trong vòng phân vùng
  • Không sử dụng các mã nhận dạng chữ hoa và chữ thường hỗn hợp mà không có trích dẫn, điều đó chỉ dẫn đến sự nhầm lẫn. (Tốt hơn hết:không sử dụng số nhận dạng chữ hoa và chữ thường hỗn hợp trong PostgreSQL đã từng )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Biến bảng PostgreSQL

  2. Đi thẳng vào đám mây tại CHAR (10)

  3. Làm cách nào để sửa lỗi phiên bản pg_dump không khớp?

  4. Nhận kích thước của đối tượng lớn trong truy vấn PostgreSQL?

  5. Amazon RDS cho PostgreSQL Alternatives - ClusterControl cho PostgreSQL