tpch.sql 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. -- Copyright Materialize, Inc. and contributors. All rights reserved.
  2. --
  3. -- Use of this software is governed by the Business Source License
  4. -- included in the LICENSE file at the root of this repository.
  5. --
  6. -- As of the Change Date specified in that file, in accordance with
  7. -- the Business Source License, use of this software will be governed
  8. -- by the Apache License, Version 2.0.
  9. -- Queries for to workload of the `TPCH` benchmarking scenario.
  10. -- name: Q01
  11. SELECT
  12. l_returnflag,
  13. l_linestatus,
  14. sum(l_quantity) AS sum_qty,
  15. sum(l_extendedprice) AS sum_base_price,
  16. sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
  17. sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
  18. avg(l_quantity) AS avg_qty,
  19. avg(l_extendedprice) AS avg_price,
  20. avg(l_discount) AS avg_disc,
  21. count(*) AS count_order
  22. FROM
  23. lineitem
  24. WHERE
  25. l_shipdate <= DATE '1998-12-01' - INTERVAL '60' day
  26. GROUP BY
  27. l_returnflag,
  28. l_linestatus
  29. ORDER BY
  30. l_returnflag,
  31. l_linestatus;
  32. -- name: Q02
  33. SELECT
  34. s_acctbal,
  35. s_name,
  36. n_name,
  37. p_partkey,
  38. p_mfgr,
  39. s_address,
  40. s_phone,
  41. s_comment
  42. FROM
  43. part, supplier, partsupp, nation, region
  44. WHERE
  45. p_partkey = ps_partkey
  46. AND s_suppkey = ps_suppkey
  47. AND p_size = CAST (15 AS smallint)
  48. AND p_type LIKE '%BRASS'
  49. AND s_nationkey = n_nationkey
  50. AND n_regionkey = r_regionkey
  51. AND r_name = 'EUROPE'
  52. AND ps_supplycost
  53. = (
  54. SELECT
  55. min(ps_supplycost)
  56. FROM
  57. partsupp, supplier, nation, region
  58. WHERE
  59. p_partkey = ps_partkey
  60. AND s_suppkey = ps_suppkey
  61. AND s_nationkey = n_nationkey
  62. AND n_regionkey = r_regionkey
  63. AND r_name = 'EUROPE'
  64. )
  65. ORDER BY
  66. s_acctbal DESC, n_name, s_name, p_partkey;
  67. -- name: Q03
  68. SELECT
  69. l_orderkey,
  70. sum(l_extendedprice * (1 - l_discount)) AS revenue,
  71. o_orderdate,
  72. o_shippriority
  73. FROM
  74. customer,
  75. orders,
  76. lineitem
  77. WHERE
  78. c_mktsegment = 'BUILDING'
  79. AND c_custkey = o_custkey
  80. AND l_orderkey = o_orderkey
  81. AND o_orderdate < DATE '1995-03-15'
  82. AND l_shipdate > DATE '1995-03-15'
  83. GROUP BY
  84. l_orderkey,
  85. o_orderdate,
  86. o_shippriority
  87. ORDER BY
  88. revenue DESC,
  89. o_orderdate;
  90. -- name: Q04
  91. SELECT
  92. o_orderpriority,
  93. count(*) AS order_count
  94. FROM
  95. orders
  96. WHERE
  97. o_orderdate >= DATE '1993-07-01'
  98. AND o_orderdate < DATE '1993-07-01' + INTERVAL '3' month
  99. AND EXISTS (
  100. SELECT
  101. *
  102. FROM
  103. lineitem
  104. WHERE
  105. l_orderkey = o_orderkey
  106. AND l_commitdate < l_receiptdate
  107. )
  108. GROUP BY
  109. o_orderpriority
  110. ORDER BY
  111. o_orderpriority;
  112. -- name: Q05
  113. SELECT
  114. n_name,
  115. sum(l_extendedprice * (1 - l_discount)) AS revenue
  116. FROM
  117. customer,
  118. orders,
  119. lineitem,
  120. supplier,
  121. nation,
  122. region
  123. WHERE
  124. c_custkey = o_custkey
  125. AND l_orderkey = o_orderkey
  126. AND l_suppkey = s_suppkey
  127. AND c_nationkey = s_nationkey
  128. AND s_nationkey = n_nationkey
  129. AND n_regionkey = r_regionkey
  130. AND r_name = 'ASIA'
  131. AND o_orderdate >= DATE '1994-01-01'
  132. AND o_orderdate < DATE '1995-01-01'
  133. GROUP BY
  134. n_name
  135. ORDER BY
  136. revenue DESC;
  137. -- name: Q06
  138. SELECT
  139. sum(l_extendedprice * l_discount) AS revenue
  140. FROM
  141. lineitem
  142. WHERE
  143. l_quantity < 24
  144. AND l_shipdate >= DATE '1994-01-01'
  145. AND l_shipdate < DATE '1994-01-01' + INTERVAL '1' year
  146. AND l_discount BETWEEN 0.06 - 0.01 AND 0.07;
  147. -- name: Q07
  148. SELECT
  149. supp_nation,
  150. cust_nation,
  151. l_year,
  152. sum(volume) AS revenue
  153. FROM
  154. (
  155. SELECT
  156. n1.n_name AS supp_nation,
  157. n2.n_name AS cust_nation,
  158. extract(year FROM l_shipdate) AS l_year,
  159. l_extendedprice * (1 - l_discount) AS volume
  160. FROM
  161. supplier,
  162. lineitem,
  163. orders,
  164. customer,
  165. nation n1,
  166. nation n2
  167. WHERE
  168. s_suppkey = l_suppkey
  169. AND o_orderkey = l_orderkey
  170. AND c_custkey = o_custkey
  171. AND s_nationkey = n1.n_nationkey
  172. AND c_nationkey = n2.n_nationkey
  173. AND (
  174. (n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY')
  175. or (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE')
  176. )
  177. AND l_shipdate BETWEEN DATE '1995-01-01' AND DATE '1996-12-31'
  178. ) AS shipping
  179. GROUP BY
  180. supp_nation,
  181. cust_nation,
  182. l_year
  183. ORDER BY
  184. supp_nation,
  185. cust_nation,
  186. l_year;
  187. -- name: Q08
  188. SELECT
  189. o_year,
  190. sum(case
  191. when nation = 'BRAZIL' then volume
  192. else 0
  193. end) / sum(volume) AS mkt_share
  194. FROM
  195. (
  196. SELECT
  197. extract(year FROM o_orderdate) AS o_year,
  198. l_extendedprice * (1 - l_discount) AS volume,
  199. n2.n_name AS nation
  200. FROM
  201. part,
  202. supplier,
  203. lineitem,
  204. orders,
  205. customer,
  206. nation n1,
  207. nation n2,
  208. region
  209. WHERE
  210. p_partkey = l_partkey
  211. AND s_suppkey = l_suppkey
  212. AND l_orderkey = o_orderkey
  213. AND o_custkey = c_custkey
  214. AND c_nationkey = n1.n_nationkey
  215. AND n1.n_regionkey = r_regionkey
  216. AND r_name = 'AMERICA'
  217. AND s_nationkey = n2.n_nationkey
  218. AND o_orderdate BETWEEN DATE '1995-01-01' AND DATE '1996-12-31'
  219. AND p_type = 'ECONOMY ANODIZED STEEL'
  220. ) AS all_nations
  221. GROUP BY
  222. o_year
  223. ORDER BY
  224. o_year;
  225. -- name: Q09
  226. SELECT
  227. nation,
  228. o_year,
  229. sum(amount) AS sum_profit
  230. FROM
  231. (
  232. SELECT
  233. n_name AS nation,
  234. extract(year FROM o_orderdate) AS o_year,
  235. l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity AS amount
  236. FROM
  237. part,
  238. supplier,
  239. lineitem,
  240. partsupp,
  241. orders,
  242. nation
  243. WHERE
  244. s_suppkey = l_suppkey
  245. AND ps_suppkey = l_suppkey
  246. AND ps_partkey = l_partkey
  247. AND p_partkey = l_partkey
  248. AND o_orderkey = l_orderkey
  249. AND s_nationkey = n_nationkey
  250. AND p_name like '%green%'
  251. ) AS profit
  252. GROUP BY
  253. nation,
  254. o_year
  255. ORDER BY
  256. nation,
  257. o_year DESC;
  258. -- name: Q10
  259. SELECT
  260. c_custkey,
  261. c_name,
  262. sum(l_extendedprice * (1 - l_discount)) AS revenue,
  263. c_acctbal,
  264. n_name,
  265. c_address,
  266. c_phone,
  267. c_comment
  268. FROM
  269. customer,
  270. orders,
  271. lineitem,
  272. nation
  273. WHERE
  274. c_custkey = o_custkey
  275. AND l_orderkey = o_orderkey
  276. AND o_orderdate >= DATE '1993-10-01'
  277. AND o_orderdate < DATE '1994-01-01'
  278. AND o_orderdate < DATE '1993-10-01' + INTERVAL '3' month
  279. AND l_returnflag = 'R'
  280. AND c_nationkey = n_nationkey
  281. GROUP BY
  282. c_custkey,
  283. c_name,
  284. c_acctbal,
  285. c_phone,
  286. n_name,
  287. c_address,
  288. c_comment
  289. ORDER BY
  290. revenue DESC;
  291. -- name: Q11
  292. SELECT
  293. ps_partkey,
  294. sum(ps_supplycost * ps_availqty) AS value
  295. FROM
  296. partsupp,
  297. supplier,
  298. nation
  299. WHERE
  300. ps_suppkey = s_suppkey
  301. AND s_nationkey = n_nationkey
  302. AND n_name = 'GERMANY'
  303. GROUP BY
  304. ps_partkey having
  305. sum(ps_supplycost * ps_availqty) > (
  306. SELECT
  307. sum(ps_supplycost * ps_availqty) * 0.0001
  308. FROM
  309. partsupp,
  310. supplier,
  311. nation
  312. WHERE
  313. ps_suppkey = s_suppkey
  314. AND s_nationkey = n_nationkey
  315. AND n_name = 'GERMANY'
  316. )
  317. ORDER BY
  318. value DESC;
  319. -- name: Q12
  320. SELECT
  321. l_shipmode,
  322. sum(case
  323. when o_orderpriority = '1-URGENT'
  324. or o_orderpriority = '2-HIGH'
  325. then 1
  326. else 0
  327. end) AS high_line_count,
  328. sum(case
  329. when o_orderpriority <> '1-URGENT'
  330. AND o_orderpriority <> '2-HIGH'
  331. then 1
  332. else 0
  333. end) AS low_line_count
  334. FROM
  335. orders,
  336. lineitem
  337. WHERE
  338. o_orderkey = l_orderkey
  339. AND l_shipmode IN ('MAIL', 'SHIP')
  340. AND l_commitdate < l_receiptdate
  341. AND l_shipdate < l_commitdate
  342. AND l_receiptdate >= DATE '1994-01-01'
  343. AND l_receiptdate < DATE '1994-01-01' + INTERVAL '1' year
  344. GROUP BY
  345. l_shipmode
  346. ORDER BY
  347. l_shipmode;
  348. -- name: Q13
  349. SELECT
  350. c_count,
  351. count(*) AS custdist
  352. FROM
  353. (
  354. SELECT
  355. c_custkey,
  356. count(o_orderkey) c_count -- workaround for no column aliases
  357. FROM
  358. customer LEFT OUTER JOIN orders ON
  359. c_custkey = o_custkey
  360. AND o_comment NOT LIKE '%special%requests%'
  361. GROUP BY
  362. c_custkey
  363. ) AS c_orders -- (c_custkey, c_count) -- no column aliases yet
  364. GROUP BY
  365. c_count
  366. ORDER BY
  367. custdist DESC,
  368. c_count DESC;
  369. -- name: Q14
  370. SELECT
  371. 100.00 * sum(case
  372. when p_type like 'PROMO%'
  373. then l_extendedprice * (1 - l_discount)
  374. else 0
  375. end) / sum(l_extendedprice * (1 - l_discount)) AS promo_revenue
  376. FROM
  377. lineitem,
  378. part
  379. WHERE
  380. l_partkey = p_partkey
  381. AND l_shipdate >= DATE '1995-09-01'
  382. AND l_shipdate < DATE '1995-09-01' + INTERVAL '1' month;
  383. -- name: Q15
  384. SELECT
  385. s_suppkey,
  386. s_name,
  387. s_address,
  388. s_phone,
  389. total_revenue
  390. FROM
  391. supplier,
  392. revenue
  393. WHERE
  394. s_suppkey = supplier_no
  395. AND total_revenue = (
  396. SELECT
  397. max(total_revenue)
  398. FROM
  399. revenue
  400. )
  401. ORDER BY
  402. s_suppkey;
  403. -- name: Q16
  404. SELECT
  405. p_brand,
  406. p_type,
  407. p_size,
  408. count(DISTINCT ps_suppkey) AS supplier_cnt
  409. FROM
  410. partsupp,
  411. part
  412. WHERE
  413. p_partkey = ps_partkey
  414. AND p_brand <> 'Brand#45'
  415. AND p_type NOT LIKE 'MEDIUM POLISHED%'
  416. AND p_size IN (49, 14, 23, 45, 19, 3, 36, 9)
  417. AND ps_suppkey NOT IN (
  418. SELECT
  419. s_suppkey
  420. FROM
  421. supplier
  422. WHERE
  423. s_comment like '%Customer%Complaints%'
  424. )
  425. GROUP BY
  426. p_brand,
  427. p_type,
  428. p_size
  429. ORDER BY
  430. supplier_cnt DESC,
  431. p_brand,
  432. p_type,
  433. p_size;
  434. -- name: Q17
  435. SELECT
  436. sum(l_extendedprice) / 7.0 AS avg_yearly
  437. FROM
  438. lineitem,
  439. part
  440. WHERE
  441. p_partkey = l_partkey
  442. AND p_brand = 'Brand#23'
  443. AND p_container = 'MED BOX'
  444. AND l_quantity < (
  445. SELECT
  446. 0.2 * avg(l_quantity)
  447. FROM
  448. lineitem
  449. WHERE
  450. l_partkey = p_partkey
  451. );
  452. -- name: Q18
  453. SELECT
  454. c_name,
  455. c_custkey,
  456. o_orderkey,
  457. o_orderdate,
  458. o_totalprice,
  459. sum(l_quantity)
  460. FROM
  461. customer,
  462. orders,
  463. lineitem
  464. WHERE
  465. o_orderkey IN (
  466. SELECT
  467. l_orderkey
  468. FROM
  469. lineitem
  470. GROUP BY
  471. l_orderkey having
  472. sum(l_quantity) > 300
  473. )
  474. AND c_custkey = o_custkey
  475. AND o_orderkey = l_orderkey
  476. GROUP BY
  477. c_name,
  478. c_custkey,
  479. o_orderkey,
  480. o_orderdate,
  481. o_totalprice
  482. ORDER BY
  483. o_totalprice DESC,
  484. o_orderdate;
  485. -- name: Q19
  486. SELECT
  487. sum(l_extendedprice* (1 - l_discount)) AS revenue
  488. FROM
  489. lineitem,
  490. part
  491. WHERE
  492. (
  493. p_partkey = l_partkey
  494. AND p_brand = 'Brand#12'
  495. AND p_container IN ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
  496. AND l_quantity >= CAST (1 AS smallint) AND l_quantity <= CAST (1 + 10 AS smallint)
  497. AND p_size BETWEEN CAST (1 AS smallint) AND CAST (5 AS smallint)
  498. AND l_shipmode IN ('AIR', 'AIR REG')
  499. AND l_shipinstruct = 'DELIVER IN PERSON'
  500. )
  501. or
  502. (
  503. p_partkey = l_partkey
  504. AND p_brand = 'Brand#23'
  505. AND p_container IN ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
  506. AND l_quantity >= CAST (10 AS smallint) AND l_quantity <= CAST (10 + 10 AS smallint)
  507. AND p_size BETWEEN CAST (1 AS smallint) AND CAST (10 AS smallint)
  508. AND l_shipmode IN ('AIR', 'AIR REG')
  509. AND l_shipinstruct = 'DELIVER IN PERSON'
  510. )
  511. or
  512. (
  513. p_partkey = l_partkey
  514. AND p_brand = 'Brand#34'
  515. AND p_container IN ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
  516. AND l_quantity >= CAST (20 AS smallint) AND l_quantity <= CAST (20 + 10 AS smallint)
  517. AND p_size BETWEEN CAST (1 AS smallint) AND CAST (15 AS smallint)
  518. AND l_shipmode IN ('AIR', 'AIR REG')
  519. AND l_shipinstruct = 'DELIVER IN PERSON'
  520. );
  521. -- name: Q20
  522. SELECT
  523. s_name,
  524. s_address
  525. FROM
  526. supplier,
  527. nation
  528. WHERE
  529. s_suppkey IN (
  530. SELECT
  531. ps_suppkey
  532. FROM
  533. partsupp
  534. WHERE
  535. ps_partkey IN (
  536. SELECT
  537. p_partkey
  538. FROM
  539. part
  540. WHERE
  541. p_name like 'forest%'
  542. )
  543. AND ps_availqty > (
  544. SELECT
  545. 0.5 * sum(l_quantity)
  546. FROM
  547. lineitem
  548. WHERE
  549. l_partkey = ps_partkey
  550. AND l_suppkey = ps_suppkey
  551. AND l_shipdate >= DATE '1995-01-01'
  552. AND l_shipdate < DATE '1995-01-01' + INTERVAL '1' year
  553. )
  554. )
  555. AND s_nationkey = n_nationkey
  556. AND n_name = 'CANADA'
  557. ORDER BY
  558. s_name;
  559. -- name: Q21
  560. SELECT
  561. s_name,
  562. count(*) AS numwait
  563. FROM
  564. supplier,
  565. lineitem l1,
  566. orders,
  567. nation
  568. WHERE
  569. s_suppkey = l1.l_suppkey
  570. AND o_orderkey = l1.l_orderkey
  571. AND o_orderstatus = 'F'
  572. AND l1.l_receiptdate > l1.l_commitdate
  573. AND EXISTS (
  574. SELECT
  575. *
  576. FROM
  577. lineitem l2
  578. WHERE
  579. l2.l_orderkey = l1.l_orderkey
  580. AND l2.l_suppkey <> l1.l_suppkey
  581. )
  582. AND not EXISTS (
  583. SELECT
  584. *
  585. FROM
  586. lineitem l3
  587. WHERE
  588. l3.l_orderkey = l1.l_orderkey
  589. AND l3.l_suppkey <> l1.l_suppkey
  590. AND l3.l_receiptdate > l3.l_commitdate
  591. )
  592. AND s_nationkey = n_nationkey
  593. AND n_name = 'SAUDI ARABIA'
  594. GROUP BY
  595. s_name
  596. ORDER BY
  597. numwait DESC,
  598. s_name;
  599. -- name: Q22
  600. SELECT
  601. cntrycode,
  602. count(*) AS numcust,
  603. sum(c_acctbal) AS totacctbal
  604. FROM
  605. (
  606. SELECT
  607. substring(c_phone, 1, 2) AS cntrycode, c_acctbal
  608. FROM
  609. customer
  610. WHERE
  611. substring(c_phone, 1, 2)
  612. IN ('13', '31', '23', '29', '30', '18', '17')
  613. AND c_acctbal
  614. > (
  615. SELECT
  616. avg(c_acctbal)
  617. FROM
  618. customer
  619. WHERE
  620. c_acctbal > 0.00
  621. AND substring(c_phone, 1, 2)
  622. IN (
  623. '13',
  624. '31',
  625. '23',
  626. '29',
  627. '30',
  628. '18',
  629. '17'
  630. )
  631. )
  632. AND NOT
  633. EXISTS(
  634. SELECT
  635. *
  636. FROM
  637. orders
  638. WHERE
  639. o_custkey = c_custkey
  640. )
  641. )
  642. AS custsale
  643. GROUP BY
  644. cntrycode
  645. ORDER BY
  646. cntrycode;