TPC-DS Q13 — Store Sales Demographics Analysis
TPC-DS benchmark · all TPC-DS queries
Computes aggregate statistics filtered by demographics and geography
Representative SQL
Rendered for DataFusion with default parameters.
SELECT AVG(ss_quantity), AVG(ss_ext_sales_price), AVG(ss_ext_wholesale_cost), SUM(ss_ext_wholesale_cost)FROM store_sales, store, customer_demographics, household_demographics, customer_address, date_dimWHERE s_store_sk = ss_store_sk AND ss_sold_date_sk = d_date_sk AND d_year = 2001 AND ( ( ss_hdemo_sk = hd_demo_sk AND cd_demo_sk = ss_cdemo_sk AND cd_marital_status = 'D' AND cd_education_status = '2 yr Degree' AND ss_sales_price BETWEEN 100.00 AND 150.00 AND hd_dep_count = 3 ) OR ( ss_hdemo_sk = hd_demo_sk AND cd_demo_sk = ss_cdemo_sk AND cd_marital_status = 'S' AND cd_education_status = 'Secondary' AND ss_sales_price BETWEEN 50.00 AND 100.00 AND hd_dep_count = 1 ) OR ( ss_hdemo_sk = hd_demo_sk AND cd_demo_sk = ss_cdemo_sk AND cd_marital_status = 'W' AND cd_education_status = 'Advanced Degree' AND ss_sales_price BETWEEN 150.00 AND 200.00 AND hd_dep_count = 1 ) ) AND ( ( ss_addr_sk = ca_address_sk AND ca_country = 'United States' AND ca_state IN ('CO', 'IL', 'MN') AND ss_net_profit BETWEEN 100 AND 200 ) OR ( ss_addr_sk = ca_address_sk AND ca_country = 'United States' AND ca_state IN ('OH', 'MT', 'NM') AND ss_net_profit BETWEEN 150 AND 300 ) OR ( ss_addr_sk = ca_address_sk AND ca_country = 'United States' AND ca_state IN ('TX', 'MO', 'MI') AND ss_net_profit BETWEEN 50 AND 250 ) )Representative DataFrame
Expression family (Polars, PySpark, DataFusion), default parameters.
def q13_expression_impl(ctx: DataFrameContext) -> Any: params = get_parameters(13) year = params.get("year", 2001) demo1_marital = params.get("demo1_marital", "D") demo1_education = params.get("demo1_education", "2 yr Degree") demo2_marital = params.get("demo2_marital", "S") demo2_education = params.get("demo2_education", "Secondary") demo3_marital = params.get("demo3_marital", "W") demo3_education = params.get("demo3_education", "Advanced Degree") states1 = params.get("states1", ["CO", "IL", "MN"]) states2 = params.get("states2", ["OH", "MT", "NM"]) states3 = params.get("states3", ["TX", "MO", "MI"])
store_sales, store, customer_demographics, household_demographics, customer_address, date_dim = _tables( ctx, "store_sales", "store", "customer_demographics", "household_demographics", "customer_address", "date_dim" ) col = ctx.col lit = ctx.lit
joined = ( store_sales.join(store, left_on="ss_store_sk", right_on="s_store_sk") .join(customer_demographics, left_on="ss_cdemo_sk", right_on="cd_demo_sk") .join(household_demographics, left_on="ss_hdemo_sk", right_on="hd_demo_sk") .join(customer_address, left_on="ss_addr_sk", right_on="ca_address_sk") .join(date_dim, left_on="ss_sold_date_sk", right_on="d_date_sk") ) predicate = (col("d_year") == lit(year)) & ( ( ( (col("cd_marital_status") == lit(demo1_marital)) & (col("cd_education_status") == lit(demo1_education)) & col("ss_sales_price").is_between(100.0, 150.0) & (col("hd_dep_count") == lit(3)) ) | ( (col("cd_marital_status") == lit(demo2_marital)) & (col("cd_education_status") == lit(demo2_education)) & col("ss_sales_price").is_between(50.0, 100.0) & (col("hd_dep_count") == lit(1)) ) | ( (col("cd_marital_status") == lit(demo3_marital)) & (col("cd_education_status") == lit(demo3_education)) & col("ss_sales_price").is_between(150.0, 200.0) & (col("hd_dep_count") == lit(1)) ) ) & ( ( (col("ca_country") == lit("United States")) & col("ca_state").is_in(states1) & col("ss_net_profit").is_between(100, 200) ) | ( (col("ca_country") == lit("United States")) & col("ca_state").is_in(states2) & col("ss_net_profit").is_between(150, 300) ) | ( (col("ca_country") == lit("United States")) & col("ca_state").is_in(states3) & col("ss_net_profit").is_between(50, 250) ) ) ) filtered = joined.filter(predicate) tallied = filtered.select( col("ss_quantity").mean().alias("avg_ss_quantity"), col("ss_ext_sales_price").mean().alias("avg_ss_ext_sales_price"), col("ss_ext_wholesale_cost").mean().alias("avg_ss_ext_wholesale_cost"), col("ss_ext_wholesale_cost").sum().alias("sum_ss_ext_wholesale_cost"), col("ss_quantity").count().alias("n"), ) return tallied.select( ctx.when(col("n") > lit(0)).then(col("avg_ss_quantity")).otherwise(lit(None)).alias("avg_ss_quantity"), ctx.when(col("n") > lit(0)) .then(col("avg_ss_ext_sales_price")) .otherwise(lit(None)) .alias("avg_ss_ext_sales_price"), ctx.when(col("n") > lit(0)) .then(col("avg_ss_ext_wholesale_cost")) .otherwise(lit(None)) .alias("avg_ss_ext_wholesale_cost"), ctx.when(col("n") > lit(0)) .then(col("sum_ss_ext_wholesale_cost")) .otherwise(lit(None)) .alias("sum_ss_ext_wholesale_cost"), )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['13'])Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:
print(bench.get_query(13, 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', '13', family="expression").source) # or family="pandas"Source
Query text: _sources/tpc-ds/query_templates/query13.tpl