fix: add last rigth value to series and refactor general stats

This commit is contained in:
skeris 2024-04-07 03:07:42 +03:00
parent d453616641
commit 2e3402cb1c

@ -400,18 +400,15 @@ FROM
-- name: GeneralStatistics :many -- name: GeneralStatistics :many
WITH TimeBucket AS ( WITH TimeBucket AS (
SELECT SELECT
CASE date_trunc('hour', timestamp_bucket)::TIMESTAMP AS time_interval_start,
WHEN EXTRACT(epoch FROM $2::timestamp) - EXTRACT(epoch FROM $1::timestamp) > 172800 THEN date_trunc('day', timestamp_bucket) COALESCE(LEAD(
ELSE date_trunc('hour', timestamp_bucket) date_trunc('hour', timestamp_bucket)::TIMESTAMP
END::TIMESTAMP AS time_interval_start, ) OVER (ORDER BY timestamp_bucket), NOW()) AS time_interval_end
LEAD(
CASE
WHEN EXTRACT(epoch FROM $2::timestamp) - EXTRACT(epoch FROM $1::timestamp) > 172800 THEN date_trunc('day', timestamp_bucket)
ELSE date_trunc('hour', timestamp_bucket)
END::TIMESTAMP
) OVER (ORDER BY timestamp_bucket) AS time_interval_end
FROM FROM
generate_series($1::timestamp with time zone, $2::timestamp with time zone, '1 hour'::interval) AS timestamp_bucket generate_series(TO_TIMESTAMP($1), TO_TIMESTAMP($2), CASE
WHEN EXTRACT(epoch FROM TO_TIMESTAMP($2)) - EXTRACT(epoch FROM TO_TIMESTAMP($1)) > 172800 THEN '1 day'::interval
ELSE '1 hour'::interval
END) AS timestamp_bucket
), ),
OpenStats AS ( OpenStats AS (
SELECT SELECT
@ -428,8 +425,8 @@ WITH TimeBucket AS (
WHERE WHERE
answer.quiz_id = $3 answer.quiz_id = $3
AND start = TRUE AND start = TRUE
AND created_at >= $1::timestamp AND created_at >= TO_TIMESTAMP($1)
AND created_at <= $2::timestamp AND created_at <= TO_TIMESTAMP($2)
GROUP BY GROUP BY
session session
) AS first_starts ) AS first_starts
@ -453,8 +450,8 @@ WITH TimeBucket AS (
WHERE WHERE
answer.quiz_id = $3 answer.quiz_id = $3
AND result = TRUE AND result = TRUE
AND created_at >= $1::timestamp AND created_at >= TO_TIMESTAMP($1)
AND created_at <= $2::timestamp AND created_at <= TO_TIMESTAMP($2)
GROUP BY GROUP BY
session session
) AS first_results ) AS first_results
@ -467,7 +464,7 @@ WITH TimeBucket AS (
SELECT SELECT
tb.time_interval_start, tb.time_interval_start,
tb.time_interval_end, tb.time_interval_end,
AVG(EXTRACT(epoch FROM (a.created_at - b.created_at))) AS avg_time AVG(EXTRACT(epoch FROM (a.created_at)) - EXTRACT(epoch FROM (b.created_at))) AS avg_time
FROM FROM
answer a answer a
JOIN answer b ON a.session = b.session JOIN answer b ON a.session = b.session
@ -478,10 +475,10 @@ WITH TimeBucket AS (
AND a.result = TRUE AND a.result = TRUE
AND b.start = TRUE AND b.start = TRUE
AND b.quiz_id = $3 AND b.quiz_id = $3
AND a.created_at >= $1::timestamp AND a.created_at >= TO_TIMESTAMP($1)
AND a.created_at <= $2::timestamp AND a.created_at <= TO_TIMESTAMP($2)
AND b.created_at >= $1::timestamp AND b.created_at >= TO_TIMESTAMP($1)
AND b.created_at <= $2::timestamp AND b.created_at <= TO_TIMESTAMP($2)
GROUP BY GROUP BY
tb.time_interval_start, tb.time_interval_end tb.time_interval_start, tb.time_interval_end
) )
@ -490,7 +487,7 @@ SELECT
COALESCE(os.open_count, 0) AS open_count, COALESCE(os.open_count, 0) AS open_count,
COALESCE(rs.true_result_count, 0) AS true_result_count, COALESCE(rs.true_result_count, 0) AS true_result_count,
CASE CASE
WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.true_result_count, 0) / COALESCE(os.open_count, 0) WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.true_result_count, 0)::float / COALESCE(os.open_count, 0)::float
ELSE 0 ELSE 0
END AS conversion, END AS conversion,
COALESCE(at.avg_time, 0) AS avg_time COALESCE(at.avg_time, 0) AS avg_time