Files
pipu-music/services/api/migrations/00015_onboarding_demographics.sql
mrleo1nid fff91c446b
ci / ts / ts (packages + web) (push) Successful in 3m19s
ci / db / db (push) Successful in 53s
ci / module boundaries / boundaries (push) Successful in 7s
ci / api / api (push) Successful in 51s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m3s
ci / recommender / recommender (push) Failing after 16s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m15s
feat(recommendations): collect demographics and advance age cohorts
2026-10-22 14:19:52 +03:00

23 lines
1.0 KiB
PL/PgSQL

-- +goose Up
-- Keep the original group and year; approximate current age from its midpoint.
-- +goose StatementBegin
CREATE FUNCTION rec_age_group(choice jsonb) RETURNS text LANGUAGE sql STABLE AS $$
WITH age AS (
SELECT CASE choice->>'age_group'
WHEN 'under_13' THEN 6 WHEN '13_19' THEN 16 WHEN '20_29' THEN 24
WHEN '30_39' THEN 34 WHEN '40_49' THEN 44 WHEN '50_59' THEN 54
WHEN '60_plus' THEN 65 END
+ GREATEST(0, EXTRACT(YEAR FROM CURRENT_DATE)::int
- COALESCE((choice->>'age_group_year')::int, EXTRACT(YEAR FROM CURRENT_DATE)::int)) AS n
)
SELECT CASE WHEN n IS NULL THEN NULL WHEN n < 13 THEN 'under_13' WHEN n < 20 THEN '13_19'
WHEN n < 30 THEN '20_29' WHEN n < 40 THEN '30_39' WHEN n < 50 THEN '40_49'
WHEN n < 60 THEN '50_59' ELSE '60_plus' END FROM age
$$;
-- +goose StatementEnd
CREATE INDEX user_profiles_rec_gender_idx ON user_profiles_rec ((onboarding->>'gender'));
-- +goose Down
DROP INDEX user_profiles_rec_gender_idx;
DROP FUNCTION rec_age_group(jsonb);