add generalstats query need testing

This commit is contained in:
Pavel 2024-03-15 19:28:22 +03:00
parent 4cc8709891
commit ea098ba021
2 changed files with 96 additions and 0 deletions

@ -385,3 +385,88 @@ FROM
OSStats,
BrowserStats,
TotalStats;
-- name: GeneralStatistics :many
WITH TimeBucket AS (
SELECT
CASE
WHEN $2 - $1 > 172800 THEN date_trunc('day', time_bucket)
ELSE date_trunc('hour', time_bucket)
END AS time_interval
FROM
generate_series(to_timestamp($1), to_timestamp($2), '1 hour') AS time_bucket
),
OpenStats AS (
SELECT
time_interval,
COUNT(DISTINCT session) AS open_count
FROM
(
SELECT
session,
MIN(created_at) AS first_start_time
FROM
answer
WHERE
quiz_id = $3
AND start = TRUE
AND created_at >= to_timestamp($1)
AND created_at <= to_timestamp($2)
GROUP BY
session
) AS first_starts
GROUP BY
time_interval
),
ResultStats AS (
SELECT
time_interval,
COUNT(DISTINCT session) AS result_count
FROM
(
SELECT
session,
MIN(created_at) AS first_result_time
FROM
answer
WHERE
quiz_id = $3
AND result = TRUE
AND created_at >= to_timestamp($1)
AND created_at <= to_timestamp($2)
GROUP BY
session
) AS first_results
GROUP BY
time_interval
),
AvTimeStats AS (
SELECT
a.time_interval,
AVG(EXTRACT(epoch FROM (a.created_at - b.created_at))) AS avg_time
FROM
answer a
JOIN answer b ON a.session = b.session
WHERE
a.quiz_id = $3
AND a.result = TRUE
AND b.start = TRUE
AND a.created_at >= to_timestamp($1)
AND a.created_at <= to_timestamp($2)
GROUP BY
a.time_interval
)
SELECT
tb.time_interval AS time_bucket,
COALESCE(os.open_count, 0) AS open_count,
COALESCE(rs.result_count, 0) AS result_count,
COALESCE(at.avg_time, 0) AS avg_time,
CASE
WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.result_count, 0) / COALESCE(os.open_count, 0)
ELSE 0
END AS conversion
FROM
TimeBucket tb
LEFT JOIN OpenStats os ON tb.time_interval = os.time_interval
LEFT JOIN ResultStats rs ON tb.time_interval = rs.time_interval
LEFT JOIN AvTimeStats at ON tb.time_interval = at.time_interval

@ -62,3 +62,14 @@ func (r *StatisticsRepository) GetDeviceStatistics(ctx context.Context, req Devi
return resp, nil
}
type GeneralStatsResp struct {
Open map[uint64]uint64 // количество ответов с полем start == true за период от одного пункта разбиения и до другого
Result map[uint64]uint64 // количество ответов с полем result == true за период от одного пункта разбиения и до другого
AvTime map[uint64]uint64 // среднее время между ответом с полем result == true и start == true. в рамках сессии
Conversion map[uint64]uint64 // Result/Open за период от одного пункта разбиения и до другого
}
func (r *StatisticsRepository) GetGeneralStatistics(ctx context.Context, req DeviceStatReq) (GeneralStatsResp, error) {
}