Eu estava lendo este artigo sobre o Google BigQuery :
Explorando um poderoso padrão SQL: ARRAY_AGG, STRUCT e UNNEST
Eles usam algumas funções que estou tentando descobrir quais são os equivalentes do Oracle, se é que existem.
Estou vasculhando a documentação do Oracle e encontrei algo semelhante ao ARRAY_AGG
Oracle chamado LISTAGG
.
O que não consegui encontrar são os equivalentes idiomáticos de STRUCT
e UNNEST
.
Tradução da técnica
A técnica para resolver um problema em um RDBMS nem sempre se traduz bem em outro.
Eu tive problemas de desempenho com código semelhante ao que estava no artigo. Assim, meu comentário "Esta técnica vai matar o desempenho no Oracle".
Não vejo
CAST(MULTISET())
(a versão do Oracle doARRAY_AGG
) sendo muito usada. Como tal, o código pode ser insustentável pelo seu substituto após receber uma promoção.Traduzindo termos
A tradução fica assim
STRUCT
em BigData éTYPE
em OracleARRAY_AGG
em BigData éCAST(MULTISET())
em OracleUNNEST
em BigData éTABLE()
em OracleUNNEST
de dados XML estáXMLTABLE()
no OracleUNNEST
dos dados JSON estãoJSON_TABLE()
no Oracle (12c+)Você não pode criar a estrutura em tempo real. Você tem que defini-lo antes do tempo.
EXEMPLOS
Criando uma estrutura de uma única linha:
Criando uma estrutura de um conjunto de linhas com base acima: (
nested table
)Usando
CAST(MULTISET())
Usando
TABLE()
Solução da Oracle
Requisito de Negócios: Quero a primeira vez que um furacão atingiu sua categoria máxima junto com sua posição.
Outros identificadores inferidos para "GROUP BY" seriam estação, bacia, sub-bacia, além do nome do furacão.
Um método para resolver isso no Oracle é usar o Analytics.
Como não tenho acesso aos dados do furacão, terei que improvisar.
A primeira coisa que fazemos é usar a função analítica
RANK()
para classificar todas as linhas porcategory
(descendente) etime
(crescente), mas particionar as classificações porseason
,basin
,subbasin
ehurricane_name
Por fim, escolheremos apenas os melhores (rank_score=1)
Juntando tudo