update sqlc gen

This commit is contained in:
Pavel 2024-03-18 13:01:58 +03:00
parent f6f40665b2
commit 8d833fc700
2 changed files with 125 additions and 107 deletions

@ -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 (

@ -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
}