Donnerstag, Februar 10, 2011

SQL Model Clause

Die SQL Model Clause ist wahrscheinlich das Element im Oracle-SQL, mit dem ich am wenigsten anfangen kann. Gelegentlich habe ich in diesem Blog schon mal auf ein paar Artikel verwiesen, in denen Rob van Wijk das Thema genauer beleuchtet - aber meine eigenen Erkenntnisse dazu sind immer noch sehr bescheiden. Daher hier mal ein kleines Beispiel, in dem ich etwas mit Model deutlich kompakter ausdrücken kann, als das mit anderen SQL-Varianten möglich wäre:

with
data
as
(
select empno
     , deptno
     , sal sal_org
     , sal
  from emp
)
select empno
     , deptno
     , sal_org
     , sal
  from data
 model
       partition by (deptno)
       dimension by (empno)
       measures (sal, sal_org)
       rules iterate(10)
       (sal[any] = sal[cv(empno)] - sal[cv(empno)]/10)

EMPNO     DEPTNO    SAL_ORG        SAL
----- ---------- ---------- ----------
 7499         30       1600 557,885504
 7521         30       1250  435,84805
 7654         30       1250  435,84805
 7698         30       2850 993,733554
 7844         30       1500  523,01766
 7900         30        950 331,244518
 7369         20        800 278,942752
 7566         20       2975 1037,31836
 7788         20       3000 1046,03532
 7876         20       1100 383,546284
 7902         20       3000 1046,03532
 7782         10       2450 854,262178
 7839         10       5000  1743,3922
 7934         10       1300 453,281972

Hier ziehe ich den emp-Mitarbeitern in 10 Iterationen jeweils 10% ihres Gehalts ab. Interessant am Beispiel sind in erster Linie die CV-Funktion (= CurrentValue) und das ITERATE-Kommando zur Definition der Schleifenanzahl. In diesem Fall ist das inhaltlich nicht besonders spannend, aber mehr fällt mir zu Model noch nicht ein. Interessanter wäre wahrscheinlich der Fall sukzessiver Steigerungen z.B. zu Ermittlung von Zinseszins-Effekten.

Keine Kommentare:

Kommentar veröffentlichen