Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एसक्यूएल चैलेंज/पहेली:एक स्टैक ट्रेस दिया गया - समय पर प्रत्येक बिंदु पर शीर्ष तत्व कैसे खोजें?

यह एक अच्छी पहेली है।

चूंकि मेरा मुख्य डीबीएमएस टेराडेटा है, इसलिए मैंने विश्लेषणात्मक कार्यों (टीडी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 के लिए काम करेगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle APEX में BLOB टाइप कॉलम का प्रयोग

  2. सूची से एसक्यूएल रैंडम स्ट्रिंग

  3. Oracle एक क्लोब को एन्क्रिप्ट/डिक्रिप्ट करता है

  4. तालिका में अगली और अगली अगली तारीख के लिए मान कैसे प्राप्त करें

  5. कैसे एक स्ट्रिंग की शुरुआत से अंक और विशेष वर्ण निकालने के लिए?