TPC-DS Q40 — Catalog Sales Before/After Returns
TPC-DS benchmark · all TPC-DS queries
Compares catalog sales before/after date accounting for returns
Representative SQL
Rendered for DataFusion with default parameters.
SELECT w_state, i_item_id, SUM( CASE WHEN ( CAST(d_date AS DATE) < CAST('1998-04-08' AS DATE) ) THEN cs_sales_price - COALESCE(cr_refunded_cash, 0) ELSE 0 END ) AS sales_before, SUM( CASE WHEN ( CAST(d_date AS DATE) >= CAST('1998-04-08' AS DATE) ) THEN cs_sales_price - COALESCE(cr_refunded_cash, 0) ELSE 0 END ) AS sales_afterFROM catalog_salesLEFT OUTER JOIN catalog_returns ON ( cs_order_number = cr_order_number AND cs_item_sk = cr_item_sk ), warehouse, item, date_dimWHERE i_current_price BETWEEN 0.99 AND 1.49 AND i_item_sk = cs_item_sk AND cs_warehouse_sk = w_warehouse_sk AND cs_sold_date_sk = d_date_sk AND d_date BETWEEN ( CAST('1998-04-08' AS DATE) - INTERVAL '30 DAY' ) AND ( CAST('1998-04-08' AS DATE) + INTERVAL '30 DAY' )GROUP BY w_state, i_item_idORDER BY w_state, i_item_idLIMIT 100Representative DataFrame
Expression family (Polars, PySpark, DataFusion), default parameters.
def q40_expression_impl(ctx: DataFrameContext) -> Any: from datetime import datetime, timedelta
params = get_parameters(40) sales_date = datetime.strptime(params.get("sales_date", "1998-04-08"), "%Y-%m-%d").date()
catalog_sales, catalog_returns, warehouse, item, date_dim = _tables( ctx, "catalog_sales", "catalog_returns", "warehouse", "item", "date_dim" ) col = ctx.col lit = ctx.lit
start_date = sales_date - timedelta(days=30) end_date = sales_date + timedelta(days=30)
date_filtered = date_dim.filter((col("d_date") >= lit(start_date)) & (col("d_date") <= lit(end_date)))
item_filtered = item.filter((col("i_current_price") >= lit(0.99)) & (col("i_current_price") <= lit(1.49)))
cs_with_cr = catalog_sales.join( catalog_returns, left_on=["cs_order_number", "cs_item_sk"], right_on=["cr_order_number", "cr_item_sk"], how="left", )
result = ( cs_with_cr.join(date_filtered, left_on="cs_sold_date_sk", right_on="d_date_sk") .join(warehouse, left_on="cs_warehouse_sk", right_on="w_warehouse_sk") .join(item_filtered, left_on="cs_item_sk", right_on="i_item_sk") )
result = result.with_columns( [ ctx.when(col("d_date") < lit(sales_date)) .then(col("cs_sales_price") - col("cr_refunded_cash").fill_null(0)) .otherwise(lit(0)) .alias("sales_before_val"), ctx.when(col("d_date") >= lit(sales_date)) .then(col("cs_sales_price") - col("cr_refunded_cash").fill_null(0)) .otherwise(lit(0)) .alias("sales_after_val"), ] )
return _sort_null_largest_expression( ctx, result.group_by(["w_state", "i_item_id"]).agg( [ ctx.sum("sales_before_val").alias("sales_before"), ctx.sum("sales_after_val").alias("sales_after"), ] ), ["w_state", "i_item_id"], ).head(100)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 TPCDS
bench = TPCDS(scale_factor=1.0) # your scale factorqueries = bench.get_queries(dialect="datafusion") # your platform's dialect; drop dialect= for native SQLprint(queries['40'])Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:
print(bench.get_query(40, scale_factor=1.0, seed=42, dialect="datafusion"))For the DataFrame form:
from benchbox.core.query_catalog import get_dataframe_render
print(get_dataframe_render('tpcds', '40', family="expression").source) # or family="pandas"Source
Query text: _sources/tpc-ds/query_templates/query40.tpl