mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix(coderd/database): aggregate user engagement statistics by interval (#16150)
This PR addresses the TODO comment here: https://github.com/coder/coder/pull/16134/files#diff-1844f895bb005f036da11d800fe2a76b54bfddd481c5d8cb15f210c64679caa5R47 The backend now backfills entries for dates with no status changes.
This commit is contained in:
@@ -789,25 +789,11 @@ WITH
|
||||
-- dates_of_interest defines all points in time that are relevant to the query.
|
||||
-- It includes the start_time, all status changes, all deletions, and the end_time.
|
||||
dates_of_interest AS (
|
||||
SELECT @start_time::timestamptz AS date
|
||||
|
||||
UNION
|
||||
|
||||
SELECT DISTINCT changed_at AS date
|
||||
FROM user_status_changes
|
||||
WHERE changed_at > @start_time::timestamptz
|
||||
AND changed_at < @end_time::timestamptz
|
||||
|
||||
UNION
|
||||
|
||||
SELECT DISTINCT deleted_at AS date
|
||||
FROM user_deleted
|
||||
WHERE deleted_at > @start_time::timestamptz
|
||||
AND deleted_at < @end_time::timestamptz
|
||||
|
||||
UNION
|
||||
|
||||
SELECT @end_time::timestamptz AS date
|
||||
SELECT date FROM generate_series(
|
||||
@start_time::timestamptz,
|
||||
@end_time::timestamptz,
|
||||
(CASE WHEN @interval::int <= 0 THEN 3600 * 24 ELSE @interval::int END || ' seconds')::interval
|
||||
) AS date
|
||||
),
|
||||
-- latest_status_before_range defines the status of each user before the start_time.
|
||||
-- We do not include users who were deleted before the start_time. We use this to ensure that
|
||||
@@ -883,7 +869,7 @@ ranked_status_change_per_user_per_date AS (
|
||||
LEFT JOIN relevant_status_changes rsc1 ON rsc1.changed_at <= d.date
|
||||
)
|
||||
SELECT
|
||||
rscpupd.date,
|
||||
rscpupd.date::timestamptz AS date,
|
||||
statuses.new_status AS status,
|
||||
COUNT(rscpupd.user_id) FILTER (
|
||||
WHERE rscpupd.rn = 1
|
||||
|
||||
Reference in New Issue
Block a user