A função finder_funnel calcula os resultados de conversão de funil dentro de uma janela de tempo e permite associar eventos por um valor de propriedade compartilhado. Por exemplo, permite rastrear a conversão passo a passo por cidade ou país, em vez de apenas por ID de usuário. Não é possível agrupar os resultados do funil por tempo.
Pré-requisitos
Antes de começar, verifique se você possui:
Hologres V2.2.32 ou superior, ou Hologres V3.0.12 ou superior.
Acesso de superusuário para instalar a extensão necessária.
Notas de uso
Instale a extensão flow_analysis como superusuário antes de executar a função finder_funnel:
CREATE extension flow_analysis; -- Install the extension.
A extensão tem escopo de banco de dados. Instale-a apenas uma vez por banco de dados.
Por padrão, o sistema carrega a extensão no schema
public, e não é possível carregá-la em outros schemas.
Sintaxe
finder_funnel(
<window>,
<start_timestamp>,
<step_interval>,
<step_numbers>,
<num_events>,
<attr_related>,
<time_zone>,
<is_relative_window>,
<server_timestamp>,
<client_timestamp>,
[<prop1>, <prop2>, ...]
<check_event1>, <check_event2>, ...
)
Parâmetros
Todos os parâmetros são obrigatórios.
|
Parâmetro |
Descrição |
|
|
A janela de tempo da análise. Unidade: milissegundos. |
|
|
O horário de início da análise. Aceita os tipos |
|
|
A granularidade de cada etapa para o cálculo de conversão. Unidade: segundos. Por exemplo, |
|
|
O número de etapas a serem analisadas. Por exemplo, |
|
|
O número de eventos a serem analisados. |
|
|
Um valor INT para especificar quais eventos têm propriedades associadas. A representação binária determina a associação: se o bit |
|
|
O fuso horário dos timestamps de entrada. Use uma string de fuso horário padrão, como |
|
|
Define se a janela usa dias corridos. Padrão: |
|
|
O horário do servidor no momento do evento. Aceita |
|
|
O horário do cliente no momento do evento. Aceita |
|
|
A propriedade do evento para usar na associação. Todas as expressões |
|
|
Expressões booleanas que identificam cada evento. Eventos correspondentes a essas condições dentro da duração da |
Como o attr_related funciona
O parâmetro attr_related utiliza uma máscara de bits binária para especificar quais eventos têm propriedades associadas.
Por exemplo, com quatro eventos (E1, E2, E3, E4):
|
**Valor de |
Binário |
Eventos com propriedades associadas |
|
|
|
Nenhum — sem associação de propriedade |
|
|
|
E1 e E2 possuem propriedades associadas |
|
|
|
E1 e E3 possuem propriedades associadas |
|
|
|
Todos os quatro eventos possuem propriedades associadas |
Quando attr_related=3 (binário 11), o sistema associa os eventos E1 e E2 pela propriedade. Forneça duas expressões <prop> — uma para cada evento. E3 e E4 não têm associação, portanto, não requerem expressões <prop>.
Janela de dias corridos
Quando is_relative_window=true, a janela se divide em dias corridos (de 00:00:00 a 23:59:59 a cada dia).
Quando is_relative_window=true , as seguintes restrições se aplicam:
<window>deve ser um múltiplo inteiro de86,400,000(milissegundos por dia).
<step_interval>deve ser86400(uma etapa = um dia).
O primeiro dia corrido começa no horário do evento e termina às 23:59:59 do mesmo dia. Cada dia subsequente é um dia corrido completo. Use este modo para observar os dados diários do funil em análises operacionais refinadas.
Valor de retorno
A função finder_funnel retorna uma linha por usuário no seguinte formato:
{<highest event reached>, <event reached in step 1>, <event reached in step 2>, ...}
O primeiro número indica o evento de maior numeração que o usuário alcançou em todas as etapas.
Cada número subsequente indica o evento de maior numeração alcançado na respectiva etapa.
Por exemplo, {4, 4, 3, 2} significa que o usuário alcançou o evento 4 no final. Na etapa 1, ele alcançou o evento 4; na etapa 2, o evento 3; na etapa 3, o evento 2.
funnel_rep
Use funnel_rep para agregar os resultados de finder_funnel de todos os usuários. Para mais detalhes, consulte Função de funil de agrupamento de dimensões (finder_group_funnel).
Exemplos
Os exemplos a seguir utilizam este conjunto de dados de amostra:
CREATE TABLE finder_funnel_test_1(id INT, event_time TIMESTAMP, event TEXT, province TEXT, city TEXT);
INSERT INTO finder_funnel_test_1 VALUES
(1111, '2024-01-02 00:00:00', 'Registration', 'Beijing', 'Beijing'),
(1111, '2024-01-02 00:00:01', 'Logon', 'Beijing', 'Beijing'),
(1111, '2024-01-02 00:00:02', 'Payment', 'Beijing', 'Beijing'),
(1111, '2024-01-02 00:00:03', 'Exit', 'Beijing', 'Beijing'),
(1111, '2024-01-03 00:00:00', 'Registration', 'Beijing', 'Beijing'),
(1111, '2024-01-03 00:00:01', 'Logon', 'Beijing', 'Beijing'),
(1111, '2024-01-03 00:00:02', 'Payment', 'Beijing', 'Beijing'),
(1111, '2024-01-04 00:00:00', 'Registration', 'Beijing', 'Beijing'),
(1111, '2024-01-04 00:00:01', 'Logon', 'Beijing', 'Beijing'),
(2222, '2024-01-02 00:00:00', 'Registration', 'Zhejiang', 'Hangzhou'),
(2222, '2024-01-02 00:00:00', 'Logon', 'Zhejiang', 'Hangzhou'),
(2222, '2024-01-02 00:00:01', 'Payment', 'Zhejiang', 'Hangzhou'),
(2222, '2024-01-02 00:00:03', 'Payment', 'Zhejiang', 'Hangzhou');
Exemplo 1: Funil básico sem associação de propriedade
Uma janela de 3 dias dividida em 3 etapas diárias, rastreando 4 eventos, sem associação de propriedade (attr_related=0):
SELECT
id,
finder_funnel(
86400000 * 3, -- 3-day window
EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT,
86400, -- 1-day steps
3, -- 3 steps
4, -- 4 events
0, -- no property association
'Asia/Shanghai',
FALSE,
event_time,
event_time,
event = 'Registration',
event = 'Logon',
event = 'Payment',
event = 'Exit'
) AS funnel_res
FROM
finder_funnel_test_1
GROUP BY
id;
Resultado:
id | funnel_res
------+------------
2222 | {3,3,0,0}
1111 | {4,4,3,2}
(2 rows)
id=1111, {4,4,3,2}: O usuário 1111 alcançou o evento 4 (Exit) no final. Na etapa 1 (2 de jan), ele alcançou o evento 4; na etapa 2 (3 de jan), o evento 3 (Payment); na etapa 3 (4 de jan), o evento 2 (Logon).id=2222, {3,3,0,0}: O usuário 2222 alcançou o evento 3 (Payment) na etapa 1, sem nenhuma progressão adicional.
Exemplo 2: Funil com associação de propriedade
Defina attr_related=3 (binário 11) para associar os eventos 1 (Registration) e 2 (Logon) pela propriedade province. O sistema rastreia a conversão entre esses eventos apenas quando ambos compartilham o mesmo valor de província.
SELECT
id,
finder_funnel(
86400000 * 3,
EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT,
86400,
3,
4,
3, -- attr_related=3 (binary 11): events 1 and 2 have associated properties
'Asia/Shanghai',
FALSE,
event_time,
event_time,
province, -- prop for event 1 (Registration)
province, -- prop for event 2 (Logon)
event = 'Registration',
event = 'Logon',
event = 'Payment',
event = 'Exit'
) AS funnel_res
FROM
finder_funnel_test_1
GROUP BY
id;
Resultado:
id | funnel_res
------+------------
2222 | {3,3,0,0}
1111 | {4,4,3,2}
(2 rows)
Os resultados mostram o evento mais alto que cada usuário alcançou — e o evento mais alto por etapa — após aplicar a restrição de associação de propriedade.
Exemplo 3: Agregar resultados com funnel_rep
Use funnel_rep para somar os resultados de finder_funnel por usuário em uma visualização no nível do grupo:
SELECT
funnel_rep(3, 4, funnel_res)
FROM (
SELECT
id,
finder_funnel(
86400000 * 3,
EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT,
86400,
3,
4,
3,
'Asia/Shanghai',
FALSE,
event_time,
event_time,
province,
province,
event = 'Registration',
event = 'Logon',
event = 'Payment',
event = 'Exit'
) AS funnel_res
FROM
finder_funnel_test_1
GROUP BY
id
) a;
Resultado:
funnel_rep
-------------------------------------------
{"2,2,2,1","2,2,2,1","1,1,1,0","1,1,0,0"}
(1 row)
Exemplo 4: Janela de dias corridos
Este exemplo utiliza uma janela de 3 dias corridos (is_relative_window=TRUE) para observar os dados diários do funil.
-
Crie a tabela e insira os dados:
CREATE TABLE finder_funnel_test_3(id INT, event_time TIMESTAMP, event TEXT, province TEXT, city TEXT); INSERT INTO finder_funnel_test_3 VALUES (1111, '2024-01-02 00:00:02', 'Registration', 'Beijing', 'Beijing'), (1111, '2024-01-02 00:00:03', 'Logon', 'Beijing', 'Beijing'), (1111, '2024-01-03 00:00:04', 'Payment', 'Beijing', 'Beijing'), (1111, '2024-01-05 00:00:01', 'Exit', 'Beijing', 'Beijing'), (2222, '2024-01-02 00:00:00', 'Registration', 'Zhejiang', 'Hangzhou'), (2222, '2024-01-02 00:00:00', 'Logon', 'Zhejiang', 'Hangzhou'), (2222, '2024-01-02 00:00:01', 'Payment', 'Zhejiang', 'Hangzhou'), (2222, '2024-01-02 00:00:03', 'Payment', 'Zhejiang', 'Hangzhou'); -
Execute a consulta com uma janela de dias corridos:
SELECT id, finder_funnel( 86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 'Asia/Shanghai', TRUE, -- calendar day mode event_time, event_time, event = 'Registration', event = 'Logon', event = 'Payment', event = 'Exit' ) AS funnel_res FROM finder_funnel_test_3 GROUP BY id;Resultado:
id | funnel_res ------+------------ 1111 | {3,3,0,0} 2222 | {3,3,0,0} (2 rows)Para
id=1111: o primeiro dia corrido vai de2024-01-02 00:00:02até23:59:59. Os dias 3 e 4 de janeiro são o segundo e o terceiro dias corridos. O dia 5 de janeiro fica fora da janela de 3 dias, portanto, o sistema não contabiliza o evento Exit — o usuário 1111 alcança o evento 3 (Payment) como resultado final.