From 8d833fc7009a0d7fc2c3c1229b0e57c8083ade55 Mon Sep 17 00:00:00 2001 From: Pavel Date: Mon, 18 Mar 2024 13:01:58 +0300 Subject: [PATCH] update sqlc gen --- dal/db_query/queries.sql | 109 +++++++++++++++++--------------- dal/sqlcgen/queries.sql.go | 123 ++++++++++++++++++++----------------- 2 files changed, 125 insertions(+), 107 deletions(-) diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index b064e14..56e8ebd 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -392,91 +392,100 @@ WITH TimeBucket AS ( 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 AS time_interval + END::TIMESTAMP AS time_interval_start, + 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 generate_series($1::timestamp, $2::timestamp, '1 hour'::interval) AS timestamp_bucket ), OpenStats AS ( SELECT - tb.time_interval, + tb.time_interval_start, + tb.time_interval_end, COUNT(DISTINCT session) AS open_count - FROM ( - SELECT - session, - MAX(created_at) AS first_start_time - FROM - answer - WHERE - answer.quiz_id = $3 - AND start = TRUE - AND created_at >= $1::timestamp - AND created_at <= $2::timestamp - GROUP BY - session - ) AS first_starts - JOIN TimeBucket tb ON date_trunc('hour', first_starts.first_start_time) = tb.time_interval + FROM + ( + SELECT + session, + MIN(created_at) AS first_start_time + FROM + answer + WHERE + answer.quiz_id = $3 + AND start = TRUE + AND created_at >= $1::timestamp + AND created_at <= $2::timestamp + GROUP BY + session + ) AS first_starts + JOIN TimeBucket tb ON date_trunc('hour', first_starts.first_start_time) >= tb.time_interval_start + AND date_trunc('hour', first_starts.first_start_time) < tb.time_interval_end GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ), ResultStats AS ( SELECT - tb.time_interval, - COUNT(DISTINCT session) AS result_count + tb.time_interval_start, + tb.time_interval_end, + COUNT(*) AS true_result_count FROM - ( - SELECT - session, - MAX(created_at) AS first_result_time - FROM - answer - WHERE - answer.quiz_id = $3 - AND result = TRUE - AND created_at >= $1::timestamp - AND created_at <= $2::timestamp - GROUP BY - session - ) AS first_results - JOIN TimeBucket tb ON date_trunc('hour', first_results.first_result_time) = tb.time_interval + answer + JOIN TimeBucket tb ON date_trunc('hour', answer.created_at) >= tb.time_interval_start + AND date_trunc('hour', answer.created_at) < tb.time_interval_end + WHERE + answer.quiz_id = $3 + AND result = TRUE + AND created_at >= $1::timestamp + AND created_at <= $2::timestamp GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ), AvTimeStats AS ( SELECT - tb.time_interval, + tb.time_interval_start, + tb.time_interval_end, AVG(EXTRACT(epoch FROM (a.created_at - b.created_at))) AS avg_time FROM answer a - JOIN - answer b ON a.session = b.session - JOIN - TimeBucket tb ON date_trunc('hour', a.created_at) = tb.time_interval + JOIN answer b ON a.session = b.session + JOIN TimeBucket tb ON date_trunc('hour', a.created_at) >= tb.time_interval_start + AND date_trunc('hour', a.created_at) < tb.time_interval_end WHERE a.quiz_id = $3 AND a.result = TRUE AND b.start = TRUE + AND b.quiz_id = $3 AND a.created_at >= $1::timestamp AND a.created_at <= $2::timestamp + AND b.created_at >= $1::timestamp + AND b.created_at <= $2::timestamp GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ) SELECT - tb.time_interval AS time_bucket, + tb.time_interval_start 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, + COALESCE(rs.true_result_count, 0) AS true_result_count, CASE - WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.result_count, 0) / COALESCE(os.open_count, 0) + WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.true_result_count, 0) / COALESCE(os.open_count, 0) ELSE 0 - END AS conversion + END AS conversion, + COALESCE(at.avg_time, 0) AS avg_time FROM TimeBucket tb LEFT JOIN - OpenStats os ON tb.time_interval = os.time_interval + OpenStats os ON tb.time_interval_start = os.time_interval_start + AND tb.time_interval_end = os.time_interval_end LEFT JOIN - ResultStats rs ON tb.time_interval = rs.time_interval + ResultStats rs ON tb.time_interval_start = rs.time_interval_start + AND tb.time_interval_end = rs.time_interval_end LEFT JOIN - AvTimeStats at ON tb.time_interval = at.time_interval; + AvTimeStats at ON tb.time_interval_start = at.time_interval_start + AND tb.time_interval_end = at.time_interval_end; -- name: QuestionsStatistics :many WITH Funnel AS ( diff --git a/dal/sqlcgen/queries.sql.go b/dal/sqlcgen/queries.sql.go index a2960b9..4282ccf 100644 --- a/dal/sqlcgen/queries.sql.go +++ b/dal/sqlcgen/queries.sql.go @@ -495,91 +495,100 @@ WITH TimeBucket AS ( 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 AS time_interval + END::TIMESTAMP AS time_interval_start, + 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 generate_series($1::timestamp, $2::timestamp, '1 hour'::interval) AS timestamp_bucket ), OpenStats AS ( SELECT - tb.time_interval, + tb.time_interval_start, + tb.time_interval_end, COUNT(DISTINCT session) AS open_count - FROM ( - SELECT - session, - MAX(created_at) AS first_start_time - FROM - answer - WHERE - answer.quiz_id = $3 - AND start = TRUE - AND created_at >= $1::timestamp - AND created_at <= $2::timestamp - GROUP BY - session - ) AS first_starts - JOIN TimeBucket tb ON date_trunc('hour', first_starts.first_start_time) = tb.time_interval + FROM + ( + SELECT + session, + MIN(created_at) AS first_start_time + FROM + answer + WHERE + answer.quiz_id = $3 + AND start = TRUE + AND created_at >= $1::timestamp + AND created_at <= $2::timestamp + GROUP BY + session + ) AS first_starts + JOIN TimeBucket tb ON date_trunc('hour', first_starts.first_start_time) >= tb.time_interval_start + AND date_trunc('hour', first_starts.first_start_time) < tb.time_interval_end GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ), ResultStats AS ( SELECT - tb.time_interval, - COUNT(DISTINCT session) AS result_count + tb.time_interval_start, + tb.time_interval_end, + COUNT(*) AS true_result_count FROM - ( - SELECT - session, - MAX(created_at) AS first_result_time - FROM - answer - WHERE - answer.quiz_id = $3 - AND result = TRUE - AND created_at >= $1::timestamp - AND created_at <= $2::timestamp - GROUP BY - session - ) AS first_results - JOIN TimeBucket tb ON date_trunc('hour', first_results.first_result_time) = tb.time_interval + answer + JOIN TimeBucket tb ON date_trunc('hour', answer.created_at) >= tb.time_interval_start + AND date_trunc('hour', answer.created_at) < tb.time_interval_end + WHERE + answer.quiz_id = $3 + AND result = TRUE + AND created_at >= $1::timestamp + AND created_at <= $2::timestamp GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ), AvTimeStats AS ( SELECT - tb.time_interval, + tb.time_interval_start, + tb.time_interval_end, AVG(EXTRACT(epoch FROM (a.created_at - b.created_at))) AS avg_time FROM answer a - JOIN - answer b ON a.session = b.session - JOIN - TimeBucket tb ON date_trunc('hour', a.created_at) = tb.time_interval + JOIN answer b ON a.session = b.session + JOIN TimeBucket tb ON date_trunc('hour', a.created_at) >= tb.time_interval_start + AND date_trunc('hour', a.created_at) < tb.time_interval_end WHERE a.quiz_id = $3 AND a.result = TRUE AND b.start = TRUE + AND b.quiz_id = $3 AND a.created_at >= $1::timestamp AND a.created_at <= $2::timestamp + AND b.created_at >= $1::timestamp + AND b.created_at <= $2::timestamp GROUP BY - tb.time_interval + tb.time_interval_start, tb.time_interval_end ) SELECT - tb.time_interval AS time_bucket, + tb.time_interval_start 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, + COALESCE(rs.true_result_count, 0) AS true_result_count, CASE - WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.result_count, 0) / COALESCE(os.open_count, 0) + WHEN COALESCE(os.open_count, 0) > 0 THEN COALESCE(rs.true_result_count, 0) / COALESCE(os.open_count, 0) ELSE 0 - END AS conversion + END AS conversion, + COALESCE(at.avg_time, 0) AS avg_time FROM TimeBucket tb LEFT JOIN - OpenStats os ON tb.time_interval = os.time_interval + OpenStats os ON tb.time_interval_start = os.time_interval_start + AND tb.time_interval_end = os.time_interval_end LEFT JOIN - ResultStats rs ON tb.time_interval = rs.time_interval + ResultStats rs ON tb.time_interval_start = rs.time_interval_start + AND tb.time_interval_end = rs.time_interval_end LEFT JOIN - AvTimeStats at ON tb.time_interval = at.time_interval + AvTimeStats at ON tb.time_interval_start = at.time_interval_start + AND tb.time_interval_end = at.time_interval_end ` type GeneralStatisticsParams struct { @@ -589,11 +598,11 @@ type GeneralStatisticsParams struct { } type GeneralStatisticsRow struct { - TimeBucket time.Time `db:"time_bucket" json:"time_bucket"` - OpenCount int64 `db:"open_count" json:"open_count"` - ResultCount int64 `db:"result_count" json:"result_count"` - AvgTime float64 `db:"avg_time" json:"avg_time"` - Conversion int32 `db:"conversion" json:"conversion"` + TimeBucket time.Time `db:"time_bucket" json:"time_bucket"` + OpenCount int64 `db:"open_count" json:"open_count"` + TrueResultCount int64 `db:"true_result_count" json:"true_result_count"` + Conversion int32 `db:"conversion" json:"conversion"` + AvgTime float64 `db:"avg_time" json:"avg_time"` } func (q *Queries) GeneralStatistics(ctx context.Context, arg GeneralStatisticsParams) ([]GeneralStatisticsRow, error) { @@ -608,9 +617,9 @@ func (q *Queries) GeneralStatistics(ctx context.Context, arg GeneralStatisticsPa if err := rows.Scan( &i.TimeBucket, &i.OpenCount, - &i.ResultCount, - &i.AvgTime, + &i.TrueResultCount, &i.Conversion, + &i.AvgTime, ); err != nil { return nil, err }