Skip to content

TPC-H Q12 — Shipping Modes and Order Priority

TPC-H benchmark · all TPC-H queries

Effect of shipping modes on order priority

Representative SQL

Rendered for DataFusion with default parameters.

SELECT
l_shipmode,
SUM(
CASE
WHEN o_orderpriority = '1-URGENT' OR o_orderpriority = '2-HIGH'
THEN 1
ELSE 0
END
) AS high_line_count,
SUM(
CASE
WHEN o_orderpriority <> '1-URGENT' AND o_orderpriority <> '2-HIGH'
THEN 1
ELSE 0
END
) AS low_line_count
FROM orders, lineitem
WHERE
o_orderkey = l_orderkey
AND l_shipmode IN ('MAIL', 'SHIP')
AND l_commitdate < l_receiptdate
AND l_shipdate < l_commitdate
AND l_receiptdate >= CAST('1994-01-01' AS DATE)
AND l_receiptdate < CAST('1994-01-01' AS DATE) + INTERVAL '1 YEAR'
GROUP BY
l_shipmode
ORDER BY
l_shipmode

Representative DataFrame

Expression family (Polars, PySpark, DataFusion), default parameters.

def q12_expression_impl(ctx: DataFrameContext) -> Any:
orders = ctx.get_table("orders")
lineitem = ctx.get_table("lineitem")
col = ctx.col
lit = ctx.lit
params = get_tpch_parameters(12)
shipmode1 = params["shipmode1"]
shipmode2 = params["shipmode2"]
start_date = params["start_date"]
end_date = params["end_date"]
return (
lineitem.filter(
(col("l_shipmode").is_in([shipmode1, shipmode2]))
& (col("l_commitdate") < col("l_receiptdate"))
& (col("l_shipdate") < col("l_commitdate"))
& (col("l_receiptdate") >= lit(start_date))
& (col("l_receiptdate") < lit(end_date))
)
.join(orders, left_on="l_orderkey", right_on="o_orderkey")
.group_by("l_shipmode")
.agg(
col("o_orderpriority")
.filter(col("o_orderpriority").is_in(["1-URGENT", "2-HIGH"]))
.count()
.alias("high_line_count"),
col("o_orderpriority")
.filter(~col("o_orderpriority").is_in(["1-URGENT", "2-HIGH"]))
.count()
.alias("low_line_count"),
)
.sort("l_shipmode")
)

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 TPCH
bench = TPCH(scale_factor=0.01) # your scale factor
queries = bench.get_queries(dialect="datafusion") # your platform's dialect; drop dialect= for native SQL
print(queries['12'])

Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:

print(bench.get_query(12, scale_factor=0.01, seed=42, dialect="datafusion"))

For the DataFrame form:

from benchbox.core.query_catalog import get_dataframe_render
print(get_dataframe_render('tpch', '12', family="expression").source) # or family="pandas"

Source

Query text: benchbox/_binaries/tpc-h/templates/queries/12.sql