Skip to content

create firefox_desktop_derived.resurrection_week_2_retention_v1 table - #9004

Merged
Marlene-M-Hirose merged 9 commits into
mainfrom
do_2124_build_desktop_okr_kr_4_resurrection_wk2_table
Mar 19, 2026
Merged

create firefox_desktop_derived.resurrection_week_2_retention_v1 table#9004
Marlene-M-Hirose merged 9 commits into
mainfrom
do_2124_build_desktop_okr_kr_4_resurrection_wk2_table

Conversation

@Marlene-M-Hirose

Copy link
Copy Markdown
Contributor

Description

Add query, schema, metadata file for resurrection_week_2_retention table

Related Tickets & Documents

  • DO-2124
  • DSRE-XXXX

Reviewer, please follow this checklist

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Contributor

Integration report for "create firefox_desktop_derived.resurrection_week_2_retention_v1 table"

sql.diff

Click to expand!
diff -bur --no-dereference --new-file /tmp/workspace/main-generated-sql/dags/bqetl_desktop_retention_model.py /tmp/workspace/generated-sql/dags/bqetl_desktop_retention_model.py
--- /tmp/workspace/main-generated-sql/dags/bqetl_desktop_retention_model.py	2026-03-19 18:14:04.558751065 +0000
+++ /tmp/workspace/generated-sql/dags/bqetl_desktop_retention_model.py	2026-03-19 18:14:00.689738023 +0000
@@ -104,11 +104,10 @@
         pool="DATA_ENG_EXTERNALTASKSENSOR",
     )
 
-    wait_for_checks__fail_telemetry_derived__clients_first_seen__v2 = (
-        ExternalTaskSensor(
-            task_id="wait_for_checks__fail_telemetry_derived__clients_first_seen__v2",
-            external_dag_id="bqetl_analytics_tables",
-            external_task_id="checks__fail_telemetry_derived__clients_first_seen__v2",
+    wait_for_checks__fail_telemetry_derived__clients_last_seen__v2 = ExternalTaskSensor(
+        task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
+        external_dag_id="bqetl_main_summary",
+        external_task_id="checks__fail_telemetry_derived__clients_last_seen__v2",
             execution_delta=datetime.timedelta(seconds=10800),
             check_existence=True,
             mode="reschedule",
@@ -117,12 +116,12 @@
             failed_states=FAILED_STATES,
             pool="DATA_ENG_EXTERNALTASKSENSOR",
         )
-    )
 
-    wait_for_checks__fail_telemetry_derived__clients_last_seen__v2 = ExternalTaskSensor(
-        task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
-        external_dag_id="bqetl_main_summary",
-        external_task_id="checks__fail_telemetry_derived__clients_last_seen__v2",
+    wait_for_checks__fail_telemetry_derived__clients_first_seen__v2 = (
+        ExternalTaskSensor(
+            task_id="wait_for_checks__fail_telemetry_derived__clients_first_seen__v2",
+            external_dag_id="bqetl_analytics_tables",
+            external_task_id="checks__fail_telemetry_derived__clients_first_seen__v2",
         execution_delta=datetime.timedelta(seconds=10800),
         check_existence=True,
         mode="reschedule",
@@ -131,6 +130,7 @@
         failed_states=FAILED_STATES,
         pool="DATA_ENG_EXTERNALTASKSENSOR",
     )
+    )
 
     wait_for_telemetry_derived__clients_daily_joined__v1 = ExternalTaskSensor(
         task_id="wait_for_telemetry_derived__clients_daily_joined__v1",
@@ -207,6 +207,21 @@
         depends_on_past=False,
     )
 
+    firefox_desktop_derived__resurrection_week_2_retention__v1 = bigquery_etl_query(
+        task_id="firefox_desktop_derived__resurrection_week_2_retention__v1",
+        destination_table="resurrection_week_2_retention_v1",
+        dataset_id="firefox_desktop_derived",
+        project_id="moz-fx-data-shared-prod",
+        owner="rbaffourawuah@mozilla.com",
+        email=[
+            "mhirose@mozilla.com",
+            "rbaffourawuah@mozilla.com",
+            "telemetry-alerts@mozilla.com",
+        ],
+        date_partition_parameter="submission_date",
+        depends_on_past=False,
+    )
+
     telemetry_derived__desktop_retention__v1 = bigquery_etl_query(
         task_id="telemetry_derived__desktop_retention__v1",
         destination_table='desktop_retention_v1${{ macros.ds_format(macros.ds_add(ds, -27), "%Y-%m-%d", "%Y%m%d") }}',
@@ -279,6 +294,10 @@
         wait_for_firefox_desktop_derived__baseline_active_users__v1
     )
 
+    firefox_desktop_derived__resurrection_week_2_retention__v1.set_upstream(
+        wait_for_checks__fail_telemetry_derived__clients_last_seen__v2
+    )
+
     telemetry_derived__desktop_retention__v1.set_upstream(
         telemetry_derived__desktop_retention_clients__v1
     )
diff -bur --no-dereference --new-file /tmp/workspace/main-generated-sql/dags/bqetl_main_summary.py /tmp/workspace/generated-sql/dags/bqetl_main_summary.py
--- /tmp/workspace/main-generated-sql/dags/bqetl_main_summary.py	2026-03-19 18:14:04.971752457 +0000
+++ /tmp/workspace/generated-sql/dags/bqetl_main_summary.py	2026-03-19 18:14:01.160739611 +0000
@@ -149,6 +149,13 @@
         )
 
         ExternalTaskMarker(
+            task_id="bqetl_desktop_retention_model__wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
+            external_dag_id="bqetl_desktop_retention_model",
+            external_task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
+            execution_date="{{ (execution_date - macros.timedelta(days=-1, seconds=75600)).isoformat() }}",
+        )
+
+        ExternalTaskMarker(
             task_id="bqetl_desktop_conv_evnt_categorization__wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
             external_dag_id="bqetl_desktop_conv_evnt_categorization",
             external_task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
@@ -198,13 +205,6 @@
         )
 
         ExternalTaskMarker(
-            task_id="bqetl_desktop_retention_model__wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
-            external_dag_id="bqetl_desktop_retention_model",
-            external_task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
-            execution_date="{{ (execution_date - macros.timedelta(days=-1, seconds=75600)).isoformat() }}",
-        )
-
-        ExternalTaskMarker(
             task_id="bqetl_feature_usage__wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
             external_dag_id="bqetl_feature_usage",
             external_task_id="wait_for_checks__fail_telemetry_derived__clients_last_seen__v2",
Only in /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived: resurrection_week_2_retention_v1
diff -bur --no-dereference --new-file /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/metadata.yaml /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/metadata.yaml
--- /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/metadata.yaml	1970-01-01 00:00:00.000000000 +0000
+++ /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/metadata.yaml	2026-03-19 18:14:01.454740602 +0000
@@ -0,0 +1,33 @@
+friendly_name: Resurrection Week 2 Retention
+description: |-
+  Aggregated table tracking resurrected Firefox Desktop users and their week 2 retention.
+  A resurrected user is a returning DAU who had been inactive for 29 or more days (excluding
+  new profiles). Users are grouped by how long they were inactive before returning
+  (29-36, 37-60, 61-120, 121-180, 181-365, and 365+ days). For each group, the table
+  counts the number of resurrections and how many of those users were still active in
+  week 2 (day 8-14) following their return.
+owners:
+- rbaffourawuah@mozilla.com
+- mhirose@mozilla.com
+labels:
+  incremental: true
+  shredder_mitigation: true
+  owner1: rbaffourawuah
+  owner2: mhirose
+  dag: bqetl_desktop_retention_model
+scheduling:
+  dag_name: bqetl_desktop_retention_model
+bigquery:
+  time_partitioning:
+    type: day
+    field: submission_date
+    require_partition_filter: true
+    expiration_days: null
+workgroup_access:
+- role: roles/bigquery.dataViewer
+  members:
+  - workgroup:mozilla-confidential/data-viewers
+references:
+  query.sql:
+  - moz-fx-data-shared-prod.telemetry.desktop_active_users
+require_column_descriptions: true
diff -bur --no-dereference --new-file /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/query.sql /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/query.sql
--- /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/query.sql	1970-01-01 00:00:00.000000000 +0000
+++ /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/query.sql	2026-03-19 18:14:01.786741721 +0000
@@ -0,0 +1,97 @@
+WITH dau AS (
+  SELECT
+    client_id,
+    submission_date,
+    os,
+    normalized_os_version,
+    country,
+    CASE
+      WHEN submission_date = first_seen_date
+        THEN TRUE
+      ELSE FALSE
+    END AS is_new_profile,
+    LAG(submission_date) OVER (
+      PARTITION BY
+        client_id
+      ORDER BY
+        submission_date
+    ) AS prev_submission_date
+  FROM
+    `moz-fx-data-shared-prod.telemetry.desktop_active_users`
+  WHERE
+    is_dau = TRUE
+    AND is_desktop = TRUE
+    AND submission_date
+    BETWEEN DATE_SUB((DATE_SUB(@submission_date, INTERVAL 13 DAY)), INTERVAL 365 DAY)
+    AND (DATE_SUB(@submission_date, INTERVAL 13 DAY))
+),
+active_users AS (
+  SELECT
+    au.submission_date,
+    au.client_id,
+    mozfun.bits28.retention(
+      au.days_active_bits & au.days_seen_bits,
+      au.submission_date
+    ) AS retention_active,
+  FROM
+    `moz-fx-data-shared-prod.telemetry.desktop_active_users` AS au
+  WHERE
+    au.submission_date = @submission_date
+),
+final_with_days AS (
+  SELECT
+    d.*,
+    DATE_DIFF(d.submission_date, prev_submission_date, DAY) AS num_days_since_last_seen,
+    au.retention_active.day_13.active_in_week_1 AS retained_week_2,
+  FROM
+    dau d
+  LEFT JOIN
+    active_users au
+    ON d.client_id = au.client_id
+    AND d.submission_date = au.retention_active.day_13.metric_date
+  WHERE
+    d.submission_date = DATE_SUB(@submission_date, INTERVAL 13 DAY)
+)
+SELECT
+  submission_date,
+  os,
+  normalized_os_version,
+  country,
+  CASE
+    WHEN num_days_since_last_seen
+      BETWEEN 29
+      AND 36
+      THEN ' 29-36'
+    WHEN num_days_since_last_seen
+      BETWEEN 37
+      AND 60
+      THEN ' 37-60'
+    WHEN num_days_since_last_seen
+      BETWEEN 61
+      AND 120
+      THEN ' 61-120'
+    WHEN num_days_since_last_seen
+      BETWEEN 121
+      AND 180
+      THEN '121-180'
+    WHEN num_days_since_last_seen
+      BETWEEN 181
+      AND 365
+      THEN '181-365'
+    ELSE '365+'
+  END AS num_days_since_last_seen,
+    -- num_days_since_last_seen,
+  COUNT(DISTINCT client_id) AS dau,
+  COUNT(DISTINCT client_id) AS resurrections,
+  COUNT(DISTINCT CASE WHEN retained_week_2 THEN client_id END) AS resurrections_retained_wk2
+FROM
+  final_with_days
+WHERE
+  NOT is_new_profile
+  AND (num_days_since_last_seen >= 29 OR num_days_since_last_seen IS NULL)
+GROUP BY
+  1,
+  2,
+  3,
+  4,
+  5
diff -bur --no-dereference --new-file /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/schema.yaml /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/schema.yaml
--- /tmp/workspace/main-generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/schema.yaml	1970-01-01 00:00:00.000000000 +0000
+++ /tmp/workspace/generated-sql/sql/moz-fx-data-shared-prod/firefox_desktop_derived/resurrection_week_2_retention_v1/schema.yaml	2026-03-19 18:14:01.786741721 +0000
@@ -0,0 +1,38 @@
+fields:
+- name: submission_date
+  type: DATE
+  mode: NULLABLE
+  description: The date when the telemetry ping is received on the server side.
+- name: os
+  type: STRING
+  mode: NULLABLE
+  description: The normalized name of the operating system running at the client.
+- name: normalized_os_version
+  type: STRING
+  mode: NULLABLE
+  description: Version of the operating system running at the client, e.g. "100.9.11".
+- name: country
+  type: STRING
+  mode: NULLABLE
+  description: Name of the country in which the activity took place, as determined by
+    the IP geolocation.
+- name: num_days_since_last_seen
+  type: STRING
+  mode: NULLABLE
+  description: Bucketed label for the number of days the user had been inactive before
+    returning, grouped into ranges (29-36, 37-60, 61-120, 121-180, 181-365, 365+).
+- name: dau
+  type: INTEGER
+  mode: NULLABLE
+  description: The number of daily active users, corresponding to the count of clients
+    that reported at least one ping on the submission_date and qualify as active.
+- name: resurrections
+  type: INTEGER
+  mode: NULLABLE
+  description: Count of resurrected users on the submission_date, defined as returning
+    DAU who had been inactive for 29 or more days.
+- name: resurrections_retained_wk2
+  type: INTEGER
+  mode: NULLABLE
+  description: Count of resurrected users who remained active in week 2 (days 8-14)
+    following their return.

Link to full diff

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants