add generalstats query need testing
This commit is contained in:
parent
4cc8709891
commit
ea098ba021
@ -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) {
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user