यह एक अच्छी पहेली है।
चूंकि मेरा मुख्य डीबीएमएस टेराडेटा है, इसलिए मैंने विश्लेषणात्मक कार्यों (टीडी14.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;
यह समाधान Oracle के लिए भी काम करता है, लेकिन PostgreSQL और SQL सर्वर IGNORE NULLS
का समर्थन नहीं करते हैं LAST_VALUE
. के लिए विकल्प और इसका अनुकरण करना काफी जटिल है, उदाहरण के लिए इट्ज़क बेन-गण का The Last non NULL देखें। पहेली
संपादित करें:वास्तव में यह इतना जटिल नहीं है, मैं इत्ज़िक का दूसरा समाधान, पुरानी पिगीबैक चाल;-)
भूल गया।मार्टिन स्मिथ का दृष्टिकोण सभी चार DBMSes के लिए काम करेगा।