MariaDB: FIRST_VALUE bei Werten in Reihe

Tommy57

Erfahrenes Mitglied
Hallo,

ich versuche gerade ein Statement zu schreiben, wo ich gleiche und direkt aufeinander folgende Jahre gruppieren möchte und dann von jeder dieser Gruppen den ersten und letzten Wert kriege.

type_id;year
1;2001
1;2001
1;2002
1;2003
1;2007
1;2008
2;2002
2;2003
2;2004

Ziel ist:
1;2001-2003
1;2007-2008
2;2002-2004

Gruß, Tommy
 
Prinzipiell ist es eigentlich einfach, da man mit LAG und LEAD die vorherige zeile bekommt. Aber ich krieg die Gruppen danach nicht zusammen.
 
Vielen Dank für die Antwort. Deine Lösung ist sehr interessat. Habe aber jetzt schon hingekriegt.

Bei mariaDB gibt es Window-Funktionen, die einem die Arbeit erleichtern.

Code:
SELECT
    *,
    FIRST_VALUE(year) OVER(PARTITION BY type_id, priority ORDER BY ranking) AS first_year,
    FIRST_VALUE(year) OVER(PARTITION BY type_id, priority ORDER BY ranking DESC) AS last_year
FROM
    (SELECT
        *,
        SUM(consecutive) OVER(PARTITION BY type_id ORDER BY ranking ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS priority
    FROM
        (SELECT
            *,
            CASE
                WHEN (
                    type_id = prev_type_id
                AND
                    ((year = prev_year) OR (year - 1 = prev_year))
                ) THEN 0
                ELSE 1
            END AS consecutive
        FROM
            (SELECT
                *,
                LAG(type_id) OVER(ORDER BY ranking) AS prev_type_id,
                LAG(year) OVER(ORDER BY ranking) AS prev_year
            FROM
                (SELECT
                    type_id,
                    year,
                    ROW_NUMBER() OVER(ORDER BY type_id ASC, year ASC) AS ranking
                FROM
                    test) x0) y0
        ORDER BY
            ranking) z0
    ORDER BY
        ranking) a0
ORDER BY
    type_id ASC,
    priority ASC,
    ranking ASC

Gruß, Tommy
 

Neue Beiträge

Zurück