Skip to content

TPC-DS-OBT Q14 — obt_bulk_sales

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

Multi-unit sales volume and revenue by channel

Representative SQL

Rendered for DataFusion with default parameters.

WITH cross_items AS (
SELECT
item_i_item_sk,
item_i_brand_id,
item_i_class_id,
item_i_category_id
FROM (
SELECT
item_i_item_sk,
item_i_brand_id,
item_i_class_id,
item_i_category_id,
channel
FROM tpcds_sales_returns_obt
WHERE
sold_date_d_year BETWEEN 1998 AND 1998 + 2
GROUP BY
item_i_item_sk,
item_i_brand_id,
item_i_class_id,
item_i_category_id,
channel
) AS items_by_channel
GROUP BY
item_i_item_sk,
item_i_brand_id,
item_i_class_id,
item_i_category_id
HAVING
COUNT(DISTINCT channel) = 3
), avg_sales AS (
SELECT
AVG(quantity * list_price) AS average_sales
FROM tpcds_sales_returns_obt
WHERE
sold_date_d_year BETWEEN 1998 AND 1998 + 2
)
SELECT
channel,
i_brand_id,
i_class_id,
i_category_id,
SUM(sales),
SUM(number_sales)
FROM (
SELECT
channel,
item_i_brand_id AS i_brand_id,
item_i_class_id AS i_class_id,
item_i_category_id AS i_category_id,
SUM(quantity * list_price) AS sales,
COUNT(*) AS number_sales
FROM tpcds_sales_returns_obt
WHERE
item_sk IN (
SELECT
item_i_item_sk
FROM cross_items
)
AND sold_date_d_year = 1998 + 2
AND sold_date_d_moy = 11
GROUP BY
channel,
item_i_brand_id,
item_i_class_id,
item_i_category_id
HAVING
SUM(quantity * list_price) > (
SELECT
average_sales
FROM avg_sales
)
) AS y
GROUP BY
ROLLUP (
channel,
i_brand_id,
i_class_id,
i_category_id
)
ORDER BY
channel,
i_brand_id,
i_class_id,
i_category_id
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['14'])

For the DataFrame form:

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

Source

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