Advertisement
kirzecy670

Untitled

Jun 25th, 2025 (edited)
869
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 2.31 KB | None | 0 0
  1. SELECT
  2.     user_id,
  3.     family_role
  4. FROM (
  5.     SELECT
  6.         user_id,
  7.         arraySort(x -> x.1, groupArray(family_role_with_priority))[1].2 AS family_role
  8.     FROM (
  9.         WITH
  10.             anyIf(TRUE, n_members > 1) OVER (PARTITION BY circle_id)       AS has_other_members,
  11.             anyIf(TRUE, user_role = 'Child') OVER (PARTITION BY circle_id) AS has_children,
  12.             -- tuples of (priority, family role)
  13.             multiIf(
  14.                 user_role = 'Adult' AND has_children AND adult_order = 1 AND n_members > 2, (1, 'first parent in full family'),
  15.                 user_role = 'Adult' AND has_children AND adult_order = 1 AND n_members = 2, (2, 'single parent in full family'),
  16.                 user_role = 'Adult' AND has_other_members AND adult_order = 1,              (3, 'first parent with adults only'),
  17.                 user_role = 'Adult' AND has_children AND adult_order > 1,                   (4, 'second+ parent in full family'),
  18.                 user_role = 'Adult' AND has_other_members AND adult_order > 1,              (5, 'second+ parent with adults only'),
  19.                 user_role = 'Child',                                                        (6, 'child'),
  20.                 (7, 'lone adult')
  21.             ) AS family_role_with_priority
  22.         SELECT
  23.             circle_id,
  24.             user_id,
  25.             user_role,
  26.             join_ts,
  27.             creator_id,
  28.             create_ts,
  29.             family_role_with_priority
  30.         FROM (
  31.             SELECT
  32.                 circle_id,
  33.                 user_id,
  34.                 user_role,
  35.                 created_ts                                                                     AS join_ts,
  36.                 argMin(user_id, created_ts) OVER (PARTITION BY circle_id)                      AS creator_id,
  37.                 min(created_ts) OVER (PARTITION BY circle_id)                                  AS create_ts,
  38.                 count(*) OVER (PARTITION BY circle_id)                                         AS n_members,
  39.                 countIf(user_role = 'Adult') OVER (PARTITION BY circle_id ORDER BY created_ts) AS adult_order
  40.             FROM circles.circle_member
  41.         )
  42.         WHERE age('day', create_ts, now()) >= '1'
  43.             AND join_ts BETWEEN create_ts AND create_ts + INTERVAL '7' DAY
  44.     )
  45.     GROUP BY user_id
  46. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement