sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo resumir todas las filas en función de una columna de enumeración en PostgreSQL part2?

Para excluir del cálculo las filas anteriores al último Total puede usar la clave principal en una consulta de accesorios. Declare la nueva variable v_fnserial .Encuentra un fnserial de la fila con la última ocurrencia de 'Total' para el pcnum dado y fnname y asigne el valor a v_fnserial .En la consulta principal agregue una condición fnserial > v_fnserial .

Debe generar una excepción cuando la consulta principal devuelve null .

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;