TPC-DS Q51 — Cumulative Web/Store Sales
TPC-DS benchmark · all TPC-DS queries
Compares cumulative web and store sales where web exceeds store
Representative SQL
Rendered for DataFusion with default parameters.
WITH web_v1 AS ( SELECT ws_item_sk AS item_sk, d_date, SUM(SUM(ws_sales_price)) OVER ( PARTITION BY ws_item_sk ORDER BY d_date rows BETWEEN UNBOUNDED preceding AND CURRENT ROW ) AS cume_sales FROM web_sales, date_dim WHERE ws_sold_date_sk = d_date_sk AND d_month_seq BETWEEN 1212 AND 1212 + 11 AND ws_item_sk IS NOT NULL GROUP BY ws_item_sk, d_date), store_v1 AS ( SELECT ss_item_sk AS item_sk, d_date, SUM(SUM(ss_sales_price)) OVER ( PARTITION BY ss_item_sk ORDER BY d_date rows BETWEEN UNBOUNDED preceding AND CURRENT ROW ) AS cume_sales FROM store_sales, date_dim WHERE ss_sold_date_sk = d_date_sk AND d_month_seq BETWEEN 1212 AND 1212 + 11 AND ss_item_sk IS NOT NULL GROUP BY ss_item_sk, d_date)SELECT *FROM ( SELECT item_sk, d_date, web_sales, store_sales, MAX(web_sales) OVER ( PARTITION BY item_sk ORDER BY d_date rows BETWEEN UNBOUNDED preceding AND CURRENT ROW ) AS web_cumulative, MAX(store_sales) OVER ( PARTITION BY item_sk ORDER BY d_date rows BETWEEN UNBOUNDED preceding AND CURRENT ROW ) AS store_cumulative FROM ( SELECT CASE WHEN web.item_sk IS NOT NULL THEN web.item_sk ELSE store.item_sk END AS item_sk, CASE WHEN web.d_date IS NOT NULL THEN web.d_date ELSE store.d_date END AS d_date, web.cume_sales AS web_sales, store.cume_sales AS store_sales FROM web_v1 AS web FULL OUTER JOIN store_v1 AS store ON ( web.item_sk = store.item_sk AND web.d_date = store.d_date ) ) AS x) AS yWHERE web_cumulative > store_cumulativeORDER BY item_sk, d_dateLIMIT 100Representative DataFrame
Expression family (Polars, PySpark, DataFusion), default parameters.
def q51_expression_impl(ctx: DataFrameContext) -> Any: params = get_parameters(51) dms = params.get("dms", 1212)
col = ctx.col lit = ctx.lit
web_sales, store_sales, date_dim = _tables(ctx, "web_sales", "store_sales", "date_dim")
dates = date_dim.filter(col("d_month_seq").is_between(dms, dms + 11))
web_base = ( web_sales.filter(col("ws_item_sk").is_not_null()) .join(dates, left_on="ws_sold_date_sk", right_on="d_date_sk") .group_by(["ws_item_sk", "d_date"]) .agg( col("ws_sales_price").count().alias("daily_count"), col("ws_sales_price").sum().alias("daily_sales"), ) .with_columns( ctx.when(col("daily_count") > lit(0)).then(col("daily_sales")).otherwise(lit(None)).alias("daily_sales") ) )
web_v1 = ( web_base.sort(["ws_item_sk", "d_date"]) .with_columns(_q51_running_total(ctx, "ws_item_sk").alias("cume_sales")) .select( col("ws_item_sk").alias("item_sk"), col("d_date"), col("cume_sales"), ) )
store_base = ( store_sales.filter(col("ss_item_sk").is_not_null()) .join(dates, left_on="ss_sold_date_sk", right_on="d_date_sk") .group_by(["ss_item_sk", "d_date"]) .agg( col("ss_sales_price").count().alias("daily_count"), col("ss_sales_price").sum().alias("daily_sales"), ) .with_columns( ctx.when(col("daily_count") > lit(0)).then(col("daily_sales")).otherwise(lit(None)).alias("daily_sales") ) )
store_v1 = ( store_base.sort(["ss_item_sk", "d_date"]) .with_columns(_q51_running_total(ctx, "ss_item_sk").alias("cume_sales")) .select( col("ss_item_sk").alias("item_sk"), col("d_date"), col("cume_sales"), ) )
joined = _q51_merge_channels(ctx, web_v1, store_v1).sort(["item_sk_final", "d_date_final"])
web_cumulative = ( col("web_sales").fill_null(float("-inf")).cum_max().over(["item_sk_final"], order_by="d_date_final") ) store_cumulative = ( col("store_sales").fill_null(float("-inf")).cum_max().over(["item_sk_final"], order_by="d_date_final") ) result = joined.with_columns( ctx.when(web_cumulative == lit(float("-inf"))).then(None).otherwise(web_cumulative).alias("web_cumulative"), ctx.when(store_cumulative == lit(float("-inf"))) .then(None) .otherwise(store_cumulative) .alias("store_cumulative"), )
return ( result.filter(col("web_cumulative") > col("store_cumulative")) .select( col("item_sk_final").alias("item_sk"), col("d_date_final").alias("d_date"), col("web_sales"), col("store_sales"), col("web_cumulative"), col("store_cumulative"), ) .sort(["item_sk", "d_date"]) .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['51'])Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:
print(bench.get_query(51, 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', '51', family="expression").source) # or family="pandas"Source
Query text: _sources/tpc-ds/query_templates/query51.tpl