Merged PR 4819: New Dash Listings Services model

# Description

New Dash Listings Services model
There was 1 slight issue that was causing me a lot of problems, the fact that during the same day they could change the bundle multiple times was generating duplications for several accommodations.
I removed those duplicates only keeping the most recent one for each day

# Checklist

- [x] The edited models and dependants run properly with production data.
- [x] The edited models are sufficiently documented.
- [x] The edited models contain PK tests, and I've ran and passed them.
- [x] I have checked for DRY opportunities with other models and docs.
- [x] I've picked the right materialization for the affected models.

# Other

- [ ] Check if a full-refresh is required after this PR is merged.

Related work items: #28627
This commit is contained in:
Joaquin Ossa 2025-03-27 10:33:08 +00:00
commit f7504393c4
2 changed files with 160 additions and 0 deletions

View file

@ -0,0 +1,60 @@
{{
config(
materialized="table",
unique_key=[
"date",
"id_accommodation",
"id_user_product_bundle",
"service_name",
"service_business_type",
],
)
}}
with
-- Order by the most recent product bundle per accommodation per day
latest_daily_bundle as (
select
*,
row_number() over (
partition by id_accommodation, effective_start_date_utc
order by
effective_start_date_utc desc, -- Prefers the latest effective start date
original_starts_at_utc desc, -- In case of ties, prefers the most recent original start
coalesce(original_ends_at_utc, {{ var("end_of_time") }}) desc
) as rn
from {{ ref("int_core__accommodation_to_product_bundle") }}
)
select
-- Unique Key --
dd.date,
ldb.id_accommodation,
bs.id_user_product_bundle,
bs.service_name,
bs.service_business_type,
-- Dimensions --
coalesce(uh.id_deal, 'UNSET') as id_deal,
case when bs.is_default_service then 'NO' else 'YES' end as is_upgraded_service,
coalesce(uh.new_dash_version, 'UNSET') as new_dash_version,
coalesce(
uh.main_billing_country_iso_3_per_deal, 'UNSET'
) as main_billing_country_iso_3_per_deal,
coalesce(
icmas.active_accommodations_per_deal_segmentation, 'UNSET'
) as active_accommodations_per_deal_segmentation
from {{ ref("int_kpis__dimension_dates") }} as dd
inner join
{{ ref("int_core__user_host") }} as uh
on dd.date >= uh.user_in_new_dash_since_date_utc
inner join
{{ ref("int_core__user_product_bundle_contains_services") }} as bs
on uh.id_user_host = bs.id_user_host
inner join
latest_daily_bundle as ldb
on bs.id_user_product_bundle = ldb.id_user_product_bundle
and date >= ldb.effective_start_date_utc
and date < coalesce(ldb.effective_end_date_utc, {{ var("end_of_time") }})
and ldb.rn = 1
left join
{{ ref("int_kpis__dimension_daily_accommodation") }} as icmas
on uh.id_deal = icmas.id_deal
and dd.date = icmas.date

View file

@ -7482,6 +7482,106 @@ models:
- "61+"
- "UNSET"
- name: main_billing_country_iso_3_per_deal
data_type: string
description: |
Main billing country of the host aggregated at Deal level.
data_tests:
- not_null
- name: int_kpis__metric_daily_new_dash_accommodation_offered_services
description: |
This model computes the Daily Offered Services by Listings at the deepest granularity.
It only retrieves services that come from users that are in New Dash, as well
as it only considers services created after the user has moved to New Dash.
The unique key corresponds to the deepest granularity of the model,
in this case:
- date,
- id_accommodation,
- id_user_product_bundle,
- service_name,
- service_business_type
data_tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- date
- id_accommodation
- id_user_product_bundle
- service_name
- service_business_type
columns:
- name: date
data_type: date
description: Date of when user has a bundle with service active.
data_tests:
- not_null
- name: id_accommodation
data_type: bigint
description: Unique identifier of an accommodation, or listing.
data_tests:
- not_null
- name: id_user_product_bundle
data_type: bigint
description: Unique identifier of the User Product Bundle.
data_tests:
- not_null
- name: service_name
data_type: string
description: Name of the created service.
data_tests:
- not_null
- name: service_business_type
data_type: string
description: |
Identifies the service type (Screening, Deposit Management, Protection
or Guest Agreement) according to New Pricing documentation.
Cannot be null.
data_tests:
- not_null
- accepted_values:
values:
- "SCREENING"
- "PROTECTION"
- "DEPOSIT_MANAGEMENT"
- "GUEST_AGREEMENT"
- name: id_deal
data_type: string
description: Unique identifier of an account.
data_tests:
- not_null
- name: is_upgraded_service
data_type: string
description: |
Whether the service is an upgraded version of the
default. In other words, if it's not Basic Screening.
data_tests:
- not_null
- accepted_values:
values:
- "YES"
- "NO"
- name: new_dash_version
data_type: string
description: |
The version of the New Dash. It corresponds to the
release or migration phase from user point of view.
data_tests:
- not_null
- name: active_accommodations_per_deal_segmentation
data_type: string
description: |
Segment value based on the number of listings booked in 12 months
for a given deal and date.
data_tests:
- not_null
- accepted_values:
values:
- "0"
- "01-05"
- "06-20"
- "21-60"
- "61+"
- "UNSET"
- name: main_billing_country_iso_3_per_deal
data_type: string
description: |