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

SQL Challenge / Puzzle:Đưa ra một dấu vết ngăn xếp - Làm thế nào để tìm phần tử trên cùng tại mỗi thời điểm?

Đây là một câu đố hay.

Vì DBMS chính của tôi là Teradata, tôi đã viết một giải pháp cho nó bằng cách sử dụng các hàm Phân tích (cần TD14.10 +):

SELECT dt.*,
   -- find the last item in the stack with the same position
   Last_Value(val IGNORE NULLS)
   Over (PARTITION BY pos
         ORDER BY i) AS top_of_stack_val
FROM 
 ( 
   SELECT st.*,
      -- calculate the number of items in the stack
      Sum(CASE WHEN op = 'I' THEN 1 ELSE -1 end) 
      Over (ORDER BY i
            ROWS Unbounded Preceding) AS pos
   FROM stack_trace AS st
 ) AS dt;

Giải pháp này cũng hoạt động cho Oracle, nhưng PostgreSQL &SQL Server không hỗ trợ IGNORE NULLS tùy chọn cho LAST_VALUE và việc mô phỏng nó khá phức tạp, ví dụ:xem The Last không NULL của Itzk Ben-Gan Câu đố

Chỉnh sửa:Thực ra nó không phức tạp như vậy, tôi đã quên giải pháp thứ 2 của Itzik, thủ thuật cõng cũ;-)

Cách tiếp cận của Martin Smith sẽ hoạt động cho cả bốn DBMS.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhanh nhất để chèn một triệu hàng trong Oracle

  2. Kỹ thuật đảo ngược CREATE TABLE trong Oracle

  3. Làm cách nào để chọn các cột từ bảng có giá trị không rỗng?

  4. ORA-01775:chuỗi lặp lại các từ đồng nghĩa

  5. Kết nối với Oracle DB qua Trình điều khiển JDBC