SQL: Rangordnung von Bereichen nach Größe bestimmen

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



Ausgangsbasis für dieses Beispiel sollen wieder die Daten aus Aufeinanderfolgende Bereiche in einer Sequenz erkennen sein. Analog zu Bereiche einer bestimmten Größe finden ergibt sich die Bereichsgröße aus p1.id minus p0.id + 1, welche dann zur absteigenden Sortierung verwendet werden kann.

Allgemeine Lösung

SELECT p0.id AS anfang,
       p1.id AS ende,
       p1.id - p0.id + 1 AS groesse
FROM   vw_produktion AS p0,
       vw_produktion AS p1
WHERE  p0.id < p1.id AND
       NOT EXISTS( SELECT 0
                   FROM   vw_produktion AS p2 
                   WHERE  ( ( p2.druck < 1.28 OR p2.druck > 1.44 ) AND 
                            p2.id BETWEEN p0.id AND p1.id ) OR
                          ( p2.id = p0.id - 1 AND p2.druck BETWEEN 1.28 AND 1.44 ) OR
                          ( p2.id = p1.id + 1 AND p2.druck BETWEEN 1.28 AND 1.44 ) )
ORDER  BY 3 DESC, 1

Lösung mittels Window Funktion

SELECT MIN( id ) AS beginn,
       MAX( id ) AS ende,
       MAX( id ) - MIN( id ) + 1 AS groesse
FROM   ( SELECT *,
                ROW_NUMBER() OVER ( ORDER BY id )
              - ROW_NUMBER() OVER ( PARTITION BY CASE WHEN druck BETWEEN 1.28 AND 1.44 THEN 1 END
                                    ORDER BY id ) AS grp
             FROM   vw_produktion ) AS p
WHERE  druck BETWEEN 1.28 AND 1.44
GROUP  BY grp
HAVING COUNT( * ) >= 2
ORDER  BY 3 DESC, 1

Die Lösung ist in diesem DBFiddle umgesetzt.

anfang ende groesse
10 12 3
1 2 2



Zurück zur Übersicht