Skip to content

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_dim
WHERE
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 factor
queries = bench.get_queries(dialect="datafusion") # your platform's dialect; drop dialect= for native SQL
print(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