update sqlc gen
This commit is contained in:
parent
f6f40665b2
commit
8d833fc700
@ -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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user