Skip to content

TPC-DS-OBT Q4 — obt_channel_revenue

TPC-DS-OBT benchmark · all TPC-DS-OBT queries

Total net revenue by channel

Representative SQL

Rendered for DataFusion with default parameters.

WITH year_total AS (
SELECT
obt.bill_customer_c_customer_id AS customer_id,
obt.bill_customer_c_first_name AS customer_first_name,
obt.bill_customer_c_last_name AS customer_last_name,
obt.bill_customer_c_preferred_cust_flag AS customer_preferred_cust_flag,
obt.bill_customer_c_birth_country AS customer_birth_country,
obt.bill_customer_c_login AS customer_login,
obt.bill_customer_c_email_address AS customer_email_address,
obt.sold_date_d_year AS dyear,
SUM(
CAST((
(
obt.ext_list_price - obt.ext_wholesale_cost - obt.ext_discount_amt
) + obt.ext_sales_price
) AS DOUBLE PRECISION) / 2
) AS year_total,
's' AS sale_type
FROM tpcds_sales_returns_obt AS obt
WHERE
(
obt.bill_customer_c_customer_sk = obt.ship_customer_sk
AND obt.sold_date_sk = obt.sold_date_d_date_sk
)
AND channel = 'store'
GROUP BY
obt.bill_customer_c_customer_id,
obt.bill_customer_c_first_name,
obt.bill_customer_c_last_name,
obt.bill_customer_c_preferred_cust_flag,
obt.bill_customer_c_birth_country,
obt.bill_customer_c_login,
obt.bill_customer_c_email_address,
obt.sold_date_d_year
UNION ALL
SELECT
obt.bill_customer_c_customer_id AS customer_id,
obt.bill_customer_c_first_name AS customer_first_name,
obt.bill_customer_c_last_name AS customer_last_name,
obt.bill_customer_c_preferred_cust_flag AS customer_preferred_cust_flag,
obt.bill_customer_c_birth_country AS customer_birth_country,
obt.bill_customer_c_login AS customer_login,
obt.bill_customer_c_email_address AS customer_email_address,
obt.sold_date_d_year AS dyear,
SUM(
(
CAST((
(
obt.ext_list_price - obt.ext_wholesale_cost - obt.ext_discount_amt
) + obt.ext_sales_price
) AS DOUBLE PRECISION) / 2
)
) AS year_total,
'c' AS sale_type
FROM tpcds_sales_returns_obt AS obt
WHERE
(
obt.bill_customer_c_customer_sk = obt.bill_customer_sk
AND obt.sold_date_sk = obt.sold_date_d_date_sk
)
AND channel = 'catalog'
GROUP BY
obt.bill_customer_c_customer_id,
obt.bill_customer_c_first_name,
obt.bill_customer_c_last_name,
obt.bill_customer_c_preferred_cust_flag,
obt.bill_customer_c_birth_country,
obt.bill_customer_c_login,
obt.bill_customer_c_email_address,
obt.sold_date_d_year
UNION ALL
SELECT
obt.bill_customer_c_customer_id AS customer_id,
obt.bill_customer_c_first_name AS customer_first_name,
obt.bill_customer_c_last_name AS customer_last_name,
obt.bill_customer_c_preferred_cust_flag AS customer_preferred_cust_flag,
obt.bill_customer_c_birth_country AS customer_birth_country,
obt.bill_customer_c_login AS customer_login,
obt.bill_customer_c_email_address AS customer_email_address,
obt.sold_date_d_year AS dyear,
SUM(
(
CAST((
(
obt.ext_list_price - obt.ext_wholesale_cost - obt.ext_discount_amt
) + obt.ext_sales_price
) AS DOUBLE PRECISION) / 2
)
) AS year_total,
'w' AS sale_type
FROM tpcds_sales_returns_obt AS obt
WHERE
(
obt.bill_customer_c_customer_sk = obt.bill_customer_sk
AND obt.sold_date_sk = obt.sold_date_d_date_sk
)
AND channel = 'web'
GROUP BY
obt.bill_customer_c_customer_id,
obt.bill_customer_c_first_name,
obt.bill_customer_c_last_name,
obt.bill_customer_c_preferred_cust_flag,
obt.bill_customer_c_birth_country,
obt.bill_customer_c_login,
obt.bill_customer_c_email_address,
obt.sold_date_d_year
)
SELECT
t_s_secyear.customer_id,
t_s_secyear.customer_first_name,
t_s_secyear.customer_last_name,
t_s_secyear.customer_preferred_cust_flag
FROM year_total AS t_s_firstyear, year_total AS t_s_secyear, year_total AS t_c_firstyear, year_total AS t_c_secyear, year_total AS t_w_firstyear, year_total AS t_w_secyear
WHERE
t_s_secyear.customer_id = t_s_firstyear.customer_id
AND t_s_firstyear.customer_id = t_c_secyear.customer_id
AND t_s_firstyear.customer_id = t_c_firstyear.customer_id
AND t_s_firstyear.customer_id = t_w_firstyear.customer_id
AND t_s_firstyear.customer_id = t_w_secyear.customer_id
AND t_s_firstyear.sale_type = 's'
AND t_c_firstyear.sale_type = 'c'
AND t_w_firstyear.sale_type = 'w'
AND t_s_secyear.sale_type = 's'
AND t_c_secyear.sale_type = 'c'
AND t_w_secyear.sale_type = 'w'
AND t_s_firstyear.dyear = 1998
AND t_s_secyear.dyear = 1998 + 1
AND t_c_firstyear.dyear = 1998
AND t_c_secyear.dyear = 1998 + 1
AND t_w_firstyear.dyear = 1998
AND t_w_secyear.dyear = 1998 + 1
AND t_s_firstyear.year_total > 0
AND t_c_firstyear.year_total > 0
AND t_w_firstyear.year_total > 0
AND CASE
WHEN t_c_firstyear.year_total > 0
THEN CAST(t_c_secyear.year_total AS DOUBLE PRECISION) / t_c_firstyear.year_total
ELSE NULL
END > CASE
WHEN t_s_firstyear.year_total > 0
THEN CAST(t_s_secyear.year_total AS DOUBLE PRECISION) / t_s_firstyear.year_total
ELSE NULL
END
AND CASE
WHEN t_c_firstyear.year_total > 0
THEN CAST(t_c_secyear.year_total AS DOUBLE PRECISION) / t_c_firstyear.year_total
ELSE NULL
END > CASE
WHEN t_w_firstyear.year_total > 0
THEN CAST(t_w_secyear.year_total AS DOUBLE PRECISION) / t_w_firstyear.year_total
ELSE NULL
END
ORDER BY
t_s_secyear.customer_id,
t_s_secyear.customer_first_name,
t_s_secyear.customer_last_name,
t_s_secyear.customer_preferred_cust_flag
LIMIT 100

Representative DataFrame

Expression family (Polars, PySpark, DataFusion), default parameters.

def impl(ctx: DataFrameContext) -> Any:
table = ctx.get_table(OBT_TABLE)
for column, op, value in spec.filters:
table = table.filter(_FILTER_OPS[op](ctx.col(column), ctx.lit(value)))
aggregates = [getattr(ctx.col(column), func)().alias(alias) for alias, column, func in spec.aggregations]
if spec.group_keys:
result = table.group_by(*spec.group_keys).agg(*aggregates)
else:
result = table.select(*aggregates)
if spec.sort_keys:
descending = list(spec.descending) if spec.descending else [False] * len(spec.sort_keys)
result = result.sort(list(spec.sort_keys), descending=descending)
if spec.limit:
result = result.limit(spec.limit)
return result

Get the exact query for your run

The blocks above are representative. To get the precise statement a specific platform runs at a specific scale, substitute your own values:

from benchbox import TPCDSOBT
bench = TPCDSOBT(scale_factor=1.0) # your scale factor
queries = bench.get_queries(dialect="datafusion") # your platform's dialect; drop dialect= for native SQL
print(queries['4'])

For the DataFrame form:

from benchbox.core.query_catalog import get_dataframe_render
print(get_dataframe_render('tpcds_obt', '4', family="expression").source) # or family="pandas"

Source

Query text: benchbox/core/tpcds_obt/queries.py