add generalstats query need testing
This commit is contained in:
parent
4cc8709891
commit
ea098ba021
@ -385,3 +385,88 @@ FROM
|
|||||||
OSStats,
|
OSStats,
|
||||||
BrowserStats,
|
BrowserStats,
|
||||||
TotalStats;
|
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
|
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