Hay varias funciones agregadas definidas para los tipos de conjunto y de rango. Estas se describen a continuación.
La función extent
devuelve el rango o período delimitador que engloba un conjunto de valores de rango o de tiempo.
La unión es una operación muy útil para los tipos de conjunto y de rango. Como hemos visto en la “Operaciones de conjuntos”, podemos calcular la unión de dos valores de conjunto o de rango usando el operador +
. Sin embargo, también es muy útil tener una versión agregada del operador de unión para combinar un número arbitrario de valores. Las funciones set_union
y span_union
se pueden utilizar para este propósito.
La función tCount
generaliza la función de agregación tradicional count
. El conteo temporal se puede utilizar para calcular en cada momento el número de objetos disponibles (por ejemplo, el número of períodos). La función tCount
devuelve un entero temporal (ver el Capítulo 4, Tipos temporales). La función tiene dos parámetros opcionales que especifican la granularidad (un interval
) y el origen del tiempo (un timestamptz
). Cuando se dan estos parámetros, el conteo temporal se calcula en rangos de tiempo de la granularidad dada (ver “Mosaicos multidimensionales”)
Rango o período delimitador
extent({set,spans}) → span
WITH spans(r) AS ( SELECT floatspan '[1, 4)' UNION SELECT floatspan '(5, 8)' UNION SELECT floatspan '(7, 9)' ) SELECT extent(r) FROM spans; -- [1,9) WITH times(ts) AS ( SELECT tstzset '{2001-01-01, 2001-01-03, 2001-01-05}' UNION SELECT tstzset '{2001-01-02, 2001-01-04, 2001-01-06}' UNION SELECT tstzset '{2001-01-01, 2001-01-02}' ) SELECT extent(ts) FROM times; -- [2001-01-01, 2001-01-06] WITH periods(ps) AS ( SELECT tstzspanset '{[2001-01-01, 2001-01-02], [2001-01-03, 2001-01-04]}' UNION SELECT tstzspanset '{[2001-01-01, 2001-01-04], [2001-01-05, 2001-01-06]}' UNION SELECT tstzspanset '{[2001-01-02, 2001-01-06]}' ) SELECT extent(ps) FROM periods; -- [2001-01-01, 2001-01-06]
Unión agregada
setUnion({value,set}) → set
spanUnion(spans) → spanset
WITH times(ts) AS ( SELECT tstzset '{2001-01-01, 2001-01-03, 2001-01-05}' UNION SELECT tstzset '{2001-01-02, 2001-01-04, 2001-01-06}' UNION SELECT tstzset '{2001-01-01, 2001-01-02}' ) SELECT setUnion(ts) FROM times; -- {2001-01-01, 2001-01-02, 2001-01-03, 2001-01-04, 2001-01-05, 2001-01-06} WITH periods(ps) AS ( SELECT tstzspanset '{[2001-01-01, 2001-01-02], [2001-01-03, 2001-01-04]}' UNION SELECT tstzspanset '{[2001-01-02, 2001-01-03], [2001-01-05, 2001-01-06]}' UNION SELECT tstzspanset '{[2001-01-07, 2001-01-08]}' ) SELECT spanUnion(ps) FROM periods; -- {[2001-01-01, 2001-01-04], [2001-01-05, 2001-01-06], [2001-01-07, 2001-01-08]}
Conteo temporal
tCount(times) → {tintSeq,tintSeqSet}
WITH times(ts) AS ( SELECT tstzset '{2001-01-01, 2001-01-03, 2001-01-05}' UNION SELECT tstzset '{2001-01-02, 2001-01-04, 2001-01-06}' UNION SELECT tstzset '{2001-01-01, 2001-01-02}' ) SELECT tCount(ts) FROM times; -- {2@2001-01-01, 2@2001-01-02, 1@2001-01-03, 1@2001-01-04, 1@2001-01-05, 1@2001-01-06} WITH periods(ps) AS ( SELECT tstzspanset '{[2001-01-01, 2001-01-02), [2001-01-03, 2001-01-04)}' UNION SELECT tstzspanset '{[2001-01-01, 2001-01-04), [2001-01-05, 2001-01-06)}' UNION SELECT tstzspanset '{[2001-01-02, 2001-01-06)}' ) SELECT tCount(ps) FROM periods; -- {[2@2001-01-01, 3@2001-01-03, 1@2001-01-04, 2@2001-01-05, 2@2001-01-06)}