TPC-DS Q21 — Inventory Before/After Date
TPC-DS benchmark · all TPC-DS queries
Compares inventory quantities before and after a specific date by warehouse
Representative SQL
Rendered for DataFusion with default parameters.
SELECT *FROM ( SELECT w_warehouse_name, i_item_id, SUM( CASE WHEN ( CAST(d_date AS DATE) < CAST('1998-04-08' AS DATE) ) THEN inv_quantity_on_hand ELSE 0 END ) AS inv_before, SUM( CASE WHEN ( CAST(d_date AS DATE) >= CAST('1998-04-08' AS DATE) ) THEN inv_quantity_on_hand ELSE 0 END ) AS inv_after FROM inventory, warehouse, item, date_dim WHERE i_current_price BETWEEN 0.99 AND 1.49 AND i_item_sk = inv_item_sk AND inv_warehouse_sk = w_warehouse_sk AND inv_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_warehouse_name, i_item_id) AS xWHERE ( CASE WHEN inv_before > 0 THEN inv_after / inv_before ELSE NULL END ) BETWEEN 2.0 / 3.0 AND 3.0 / 2.0ORDER BY w_warehouse_name, i_item_idLIMIT 100Representative DataFrame
Expression family (Polars, PySpark, DataFusion), default parameters.
def q21_expression_impl(ctx: DataFrameContext) -> Any: from datetime import timedelta
params = get_parameters(21) price_min, price_max = 0.99, 1.49 sales_date_default = params.get("sales_date", "1998-04-08")
inventory, warehouse, item, date_dim = _tables(ctx, "inventory", "warehouse", "item", "date_dim")
col = ctx.col lit = ctx.lit
sales_date = ( datetime.strptime(sales_date_default, "%Y-%m-%d").date() if isinstance(sales_date_default, str) else sales_date_default ) date_start = sales_date - timedelta(days=30) date_end = sales_date + timedelta(days=30)
item_filtered = item.filter((col("i_current_price") >= lit(price_min)) & (col("i_current_price") <= lit(price_max)))
date_filtered = date_dim.filter((col("d_date") >= lit(date_start)) & (col("d_date") <= lit(date_end)))
inv_data = ( inventory.join(item_filtered, left_on="inv_item_sk", right_on="i_item_sk") .join(warehouse, left_on="inv_warehouse_sk", right_on="w_warehouse_sk") .join(date_filtered, left_on="inv_date_sk", right_on="d_date_sk") )
inv_data = inv_data.with_columns( [ ctx.when(col("d_date") < lit(sales_date)) .then(col("inv_quantity_on_hand")) .otherwise(lit(0)) .alias("inv_before"), ctx.when(col("d_date") >= lit(sales_date)) .then(col("inv_quantity_on_hand")) .otherwise(lit(0)) .alias("inv_after"), ] )
grouped = inv_data.group_by(["w_warehouse_name", "i_item_id"]).agg( [ ctx.sum("inv_before").alias("inv_before"), ctx.sum("inv_after").alias("inv_after"), ] )
return ( grouped.filter( (col("inv_before") > lit(0)) & ((col("inv_after") / col("inv_before")) >= lit(2.0 / 3.0)) & ((col("inv_after") / col("inv_before")) <= lit(3.0 / 2.0)) ) .sort(["w_warehouse_name", "i_item_id"], nulls_last=True) .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['21'])Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:
print(bench.get_query(21, 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', '21', family="expression").source) # or family="pandas"Source
Query text: _sources/tpc-ds/query_templates/query21.tpl