PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie summiere ich alle Zeilen basierend auf einer Aufzählungsspalte in PostgreSQL Teil2?

Zum Ausschließen von Zeilen vor dem letzten Total aus der Berechnung Sie können den Primärschlüssel in einer Zubehörabfrage verwenden. Deklarieren Sie die neue Variable v_fnserial .Suchen Sie eine fnserial der Zeile mit dem letzten Vorkommen von 'Gesamt' für gegebenen pcnum und fnname und weisen Sie den Wert v_fnserial zu .Fügen Sie in der Hauptabfrage eine Bedingung fnserial > v_fnserial hinzu .

Sie sollten eine Ausnahme auslösen, wenn die Hauptabfrage null zurückgibt .

IF NEW.timetype = 'Total' THEN
    SELECT fnserial INTO v_fnserial
    FROM mytable 
    WHERE timetype = 'Total' AND pcnum = NEW.pcnum AND fnname = NEW.fnname
    ORDER BY fnserial DESC LIMIT 1;

    SELECT SUM(timeelapse) FROM (
        SELECT DISTINCT ON (floor(timeindex)::int) floor(timeindex)::int timeindex, timeelapse 
        FROM mytable 
        WHERE fnserial > coalesce(v_fnserial, 0) AND pcnum = NEW.pcnum AND fnname = NEW.fnname AND timetype = 'Lap' 
        ORDER BY 1, 2 DESC) alias 
    INTO v_sumtimeelapse_fn;
    IF v_sumtimeelapse_fn NOTNULL THEN
        NEW.timeelapse := v_sumtimeelapse_fn;
    ELSE
        RAISE EXCEPTION USING MESSAGE = 'There is not any previous row...';
    END IF;
END IF;