Đâ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.