Como obtenho a cardinalidade de um multirange?
Estou usando range_agg()
para agregar intervalos, o que mescla intervalos se eles forem contínuos ou retorna o que parece ser uma matriz de intervalos se os intervalos forem descontínuos.
Quero detectar se há alguma lacuna no multirange e queria usar cardinality()
para isso. Uma cardinalidade de 1 significaria nenhuma lacuna, uma cardinalidade de 2 significa 1 lacuna, etc.
Entretanto, a cardinalidade não é definida em um multirange, porque um multirange não é tecnicamente uma matriz:
with x(a) as (
values
(daterange(date '2024-01-30', date '2024-03-31', '[)')),
(daterange(date '2024-04-01', date '2024-04-30', '[)'))
)
select cardinality(range_agg(a)) from x;
retorna
ERROR: function cardinality(datemultirange) does not exist
LINE 6: select cardinality(range_agg(a)) from x;
Provavelmente posso implementar a função sozinho com unnest()
e contando o número de linhas resultantes, mas estou curioso para saber se há outras boas soluções.
Um multirange é diferente de um array . O primeiro é uma adição bem recente e muito menos comumente usada. Então, menos recursos de conveniência...
Não creio que um equivalente de
cardinality()
for arrays seja implementado para multiranges. ( Tenho quase certeza, na verdade. )Mas uma variante de
unnest()
é implementada, você pode usá-la em uma expressão de subconsulta:Ou crie sua própria função personalizada (como você já pensou):
O tipo polimórfico anymultirange é útil para fazê-lo funcionar suavemente com resolução de tipo de função.
count()
retornabigint
, mas acho queinteger
é razoável. (Não haverá mais de 2^31 intervalos distintos.)Aplicado ao seu exemplo:
Funciona na página 15 também:
violino