sql >> Databasteknik >  >> RDS >> Oracle

SQL-utmaning/pussel:Givet ett stackspår - Hur hittar man det översta elementet vid varje tidpunkt?

Det här är ett trevligt pussel.

Eftersom min huvudsakliga DBMS är Teradata skrev jag en lösning för det med hjälp av analytiska funktioner (behöver 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;

Denna lösning fungerar också för Oracle, men PostgreSQL och SQL Server stöder inte IGNORE NULLS alternativ för LAST_VALUE och att emulera det är ganska komplicerat, se t.ex. Itzk Ben-Gans The Last non NULL Pussel

Edit:Det är faktiskt inte så komplicerat, jag glömde Itziks andra lösning, det gamla piggyback-tricket;-)

Martin Smiths tillvägagångssätt kommer att fungera för alla fyra DBMS.



  1. Hämta data från en Oracle-databas som en CSV-fil (eller något annat anpassat textformat)

  2. Olaglig användning av LONG datatyp Oracle

  3. Hur grupperar man efter och tar räkningen av unika och räkningen av något värde som aggregat på samma kolumn i python pandas?

  4. Kaskadera på radera eller använda triggers?