import file=tpch_schema
----

import file=tpch_stats
----

# --------------------------------------------------
# Q17
# Small-Quantity-Order Revenue
# Determines how much average yearly revenue would be lost if orders were no
# longer filled for small quantities of certain parts. This may reduce overhead
# expenses by concentrating sales on larger shipments.
#
# Considers parts of a given brand and with a given container type and
# determines the average lineitem quantity of such parts ordered for all orders
# (past and pending) in the 7-year database. What would be the average yearly
# gross (undiscounted) loss in revenue if orders for these parts with a quantity
# of less than 20% of this average were no longer taken?
#
# TODO:
#   1. Allow Select to be pushed below Ordinality used to add key column
# --------------------------------------------------
stats-quality database=tpch set=save_tables_prefix=q17
SELECT
    sum(l_extendedprice) / 7.0 AS avg_yearly
FROM
    lineitem,
    part
WHERE
    p_partkey = l_partkey
    AND p_brand = 'Brand#23'
    AND p_container = 'MED BOX'
    AND l_quantity < (
        SELECT
            0.2 * avg(l_quantity)
        FROM
            lineitem
        WHERE
            l_partkey = p_partkey
    );
----
----
project
 ├── save-table-name: q17_project_1
 ├── columns: avg_yearly:51(float)
 ├── cardinality: [1 - 1]
 ├── immutable
 ├── stats: [rows=1, distinct(51)=1, null(51)=0]
 ├── key: ()
 ├── fd: ()-->(51)
 ├── scalar-group-by
 │    ├── save-table-name: q17_scalar_group_by_2
 │    ├── columns: sum:50(float)
 │    ├── cardinality: [1 - 1]
 │    ├── immutable
 │    ├── stats: [rows=1, distinct(50)=1, null(50)=0]
 │    ├── key: ()
 │    ├── fd: ()-->(50)
 │    ├── inner-join (lookup lineitem)
 │    │    ├── save-table-name: q17_lookup_join_3
 │    │    ├── columns: l_partkey:2(int!null) l_quantity:5(float!null) l_extendedprice:6(float!null) p_partkey:19(int!null) "?column?":49(float!null)
 │    │    ├── key columns: [1 4] = [1 4]
 │    │    ├── lookup columns are key
 │    │    ├── immutable
 │    │    ├── stats: [rows=2008.967, distinct(2)=200.094, null(2)=0, distinct(5)=50, null(5)=0, distinct(6)=2006.79, null(6)=0, distinct(19)=200.094, null(19)=0, distinct(49)=200.094, null(49)=0]
 │    │    ├── fd: (19)-->(49), (2)==(19), (19)==(2)
 │    │    ├── inner-join (lookup lineitem@l_pk)
 │    │    │    ├── save-table-name: q17_lookup_join_4
 │    │    │    ├── columns: l_orderkey:1(int!null) l_partkey:2(int!null) l_linenumber:4(int!null) p_partkey:19(int!null) "?column?":49(float!null)
 │    │    │    ├── key columns: [19] = [2]
 │    │    │    ├── immutable
 │    │    │    ├── stats: [rows=6026.901, distinct(1)=6015.04, null(1)=0, distinct(2)=200.094, null(2)=0, distinct(4)=7, null(4)=0, distinct(19)=200.094, null(19)=0, distinct(49)=200.094, null(49)=0]
 │    │    │    ├── key: (1,4)
 │    │    │    ├── fd: (19)-->(49), (1,4)-->(2), (2)==(19), (19)==(2)
 │    │    │    ├── project
 │    │    │    │    ├── save-table-name: q17_project_5
 │    │    │    │    ├── columns: "?column?":49(float!null) p_partkey:19(int!null)
 │    │    │    │    ├── immutable
 │    │    │    │    ├── stats: [rows=200.0938, distinct(19)=200.094, null(19)=0, distinct(49)=200.094, null(49)=0]
 │    │    │    │    ├── key: (19)
 │    │    │    │    ├── fd: (19)-->(49)
 │    │    │    │    ├── group-by (streaming)
 │    │    │    │    │    ├── save-table-name: q17_group_by_6
 │    │    │    │    │    ├── columns: p_partkey:19(int!null) avg:48(float!null)
 │    │    │    │    │    ├── grouping columns: p_partkey:19(int!null)
 │    │    │    │    │    ├── internal-ordering: +(19|31) opt(22,25)
 │    │    │    │    │    ├── stats: [rows=200.0938, distinct(19)=200.094, null(19)=0, distinct(48)=200.094, null(48)=0]
 │    │    │    │    │    ├── key: (19)
 │    │    │    │    │    ├── fd: (19)-->(48)
 │    │    │    │    │    ├── inner-join (lookup lineitem)
 │    │    │    │    │    │    ├── save-table-name: q17_lookup_join_7
 │    │    │    │    │    │    ├── columns: p_partkey:19(int!null) p_brand:22(char!null) p_container:25(char!null) l_partkey:31(int!null) l_quantity:34(float!null)
 │    │    │    │    │    │    ├── key columns: [30 33] = [30 33]
 │    │    │    │    │    │    ├── lookup columns are key
 │    │    │    │    │    │    ├── stats: [rows=6026.912, distinct(19)=200.094, null(19)=0, distinct(22)=1, null(22)=0, distinct(25)=1, null(25)=0, distinct(31)=200.094, null(31)=0, distinct(34)=50, null(34)=0]
 │    │    │    │    │    │    ├── fd: ()-->(22,25), (19)==(31), (31)==(19)
 │    │    │    │    │    │    ├── ordering: +(19|31) opt(22,25) [actual: +19]
 │    │    │    │    │    │    ├── inner-join (lookup lineitem@l_pk)
 │    │    │    │    │    │    │    ├── save-table-name: q17_lookup_join_8
 │    │    │    │    │    │    │    ├── columns: p_partkey:19(int!null) p_brand:22(char!null) p_container:25(char!null) l_orderkey:30(int!null) l_partkey:31(int!null) l_linenumber:33(int!null)
 │    │    │    │    │    │    │    ├── key columns: [19] = [31]
 │    │    │    │    │    │    │    ├── stats: [rows=6026.912, distinct(19)=200.094, null(19)=0, distinct(22)=1, null(22)=0, distinct(25)=1, null(25)=0, distinct(30)=6015.05, null(30)=0, distinct(31)=200.094, null(31)=0, distinct(33)=7, null(33)=0]
 │    │    │    │    │    │    │    ├── key: (30,33)
 │    │    │    │    │    │    │    ├── fd: ()-->(22,25), (30,33)-->(31), (19)==(31), (31)==(19)
 │    │    │    │    │    │    │    ├── ordering: +(19|31) opt(22,25) [actual: +19]
 │    │    │    │    │    │    │    ├── select
 │    │    │    │    │    │    │    │    ├── save-table-name: q17_select_9
 │    │    │    │    │    │    │    │    ├── columns: p_partkey:19(int!null) p_brand:22(char!null) p_container:25(char!null)
 │    │    │    │    │    │    │    │    ├── stats: [rows=200.0942, distinct(19)=200.094, null(19)=0, distinct(22)=1, null(22)=0, distinct(25)=1, null(25)=0, distinct(22,25)=1, null(22,25)=0]
 │    │    │    │    │    │    │    │    │   histogram(22)=  0    200.09
 │    │    │    │    │    │    │    │    │                 <--- 'Brand#23'
 │    │    │    │    │    │    │    │    │   histogram(25)=  0   200.09
 │    │    │    │    │    │    │    │    │                 <--- 'MED BOX'
 │    │    │    │    │    │    │    │    ├── key: (19)
 │    │    │    │    │    │    │    │    ├── fd: ()-->(22,25)
 │    │    │    │    │    │    │    │    ├── ordering: +19 opt(22,25) [actual: +19]
 │    │    │    │    │    │    │    │    ├── scan part
 │    │    │    │    │    │    │    │    │    ├── save-table-name: q17_scan_10
 │    │    │    │    │    │    │    │    │    ├── columns: p_partkey:19(int!null) p_brand:22(char!null) p_container:25(char!null)
 │    │    │    │    │    │    │    │    │    ├── stats: [rows=200000, distinct(19)=199241, null(19)=0, distinct(22)=25, null(22)=0, distinct(25)=40, null(25)=0, distinct(22,25)=1000, null(22,25)=0]
 │    │    │    │    │    │    │    │    │    │   histogram(19)=  0 3.9982 929.57 3.9982 1135.5 3.9982 923.58 3.9982 1036.5 3.9982 964.56 3.9982 953.56 3.9982 899.59 3.9982 1152.5 3.9982 1118.5 3.9982 1137.5 3.9982  1129.5 3.9982  1136.5 3.9982  983.55 3.9982  983.55 3.9982  1028.5 3.9982  1007.5 3.9982  1036.5 3.9982  884.59 3.9982  985.55 3.9982  970.55 3.9982  1036.5 3.9982  943.57 3.9982  1020.5 3.9982  1001.5 3.9982  1001.5 3.9982  954.56 3.9982  1036.5 3.9982  990.54 3.9982  928.57 3.9982  1010.5 3.9982  892.59 3.9982  960.56 3.9982  1059.5 3.9982  947.56 3.9982  906.58 3.9982  935.57 3.9982  860.6 3.9982  971.55 3.9982  1067.5 3.9982  994.54 3.9982  961.56 3.9982  943.57 3.9982  901.59 3.9982  972.55 3.9982  956.56 3.9982  1106.5 3.9982  1152.5 3.9982  967.55 3.9982  943.57 3.9982  916.58 3.9982  1076.5 3.9982  933.57 3.9982  1108.5 3.9982  1081.5 3.9982  975.55 3.9982  1021.5 3.9982  1034.5 3.9982  905.58 3.9982  902.58 3.9982  966.56 3.9982  1080.5 3.9982  927.57 3.9982  936.57 3.9982  1008.5 3.9982  1033.5 3.9982  903.58 3.9982  944.57 3.9982  908.58 3.9982  1008.5 3.9982  1059.5 3.9982  1079.5 3.9982  911.58 3.9982  1107.5 3.9982  992.54 3.9982  975.55 3.9982  1156.5 3.9982  1042.5 3.9982  1072.5 3.9982  916.58 3.9982  1022.5 3.9982  999.54 3.9982  966.56 3.9982  936.57 3.9982  934.57 3.9982  969.55 3.9982  1136.5 3.9982  997.54 3.9982  991.54 3.9982  1002.5 3.9982  1047.5 3.9982  1059.5 3.9982  972.55 3.9982  918.58 3.9982  959.56 3.9982  1083.5 3.9982  934.57 3.9982  900.59 3.9982  970.55 3.9982  952.56 3.9982  1063.5  3.9982  870.6  3.9982  958.56  3.9982  1029.5  3.9982  943.57  3.9982  872.6  3.9982  972.55  3.9982  1009.5  3.9982  875.6  3.9982  1127.5  3.9982  987.55  3.9982  1156.5  3.9982  971.55  3.9982  1155.5  3.9982  930.57  3.9982  1051.5  3.9982  1044.5  3.9982  867.6  3.9982  898.59  3.9982  926.57  3.9982  965.56  3.9982  1027.5  3.9982  993.54  3.9982  927.57  3.9982  973.55  3.9982  934.57  3.9982  951.56  3.9982  1007.5  3.9982  1124.5  3.9982  936.57  3.9982  1050.5  3.9982  1075.5  3.9982  1028.5  3.9982  872.6  3.9982  960.56  3.9982  1014.5  3.9982  1017.5  3.9982  860.6  3.9982  1039.5  3.9982  1059.5  3.9982  921.58  3.9982  936.57  3.9982  1024.5  3.9982  970.55  3.9982  1047.5  3.9982  917.58  3.9982  948.56  3.9982  978.55  3.9982  993.54  3.9982  1121.5  3.9982  944.57  3.9982  1005.5  3.9982  1037.5  3.9982  1261.4  3.9982  1062.5  3.9982  925.57  3.9982  976.55  3.9982  892.59  3.9982  972.55  3.9982  1135.5  3.9982  1044.5  3.9982  959.56  3.9982  990.54  3.9982  993.54  3.9982  1130.5  3.9982  919.58  3.9982  1025.5  3.9982  1001.5  3.9982  974.55  3.9982  1061.5  3.9982  1166.5  3.9982  1017.5  3.9982  1063.5  3.9982  1188.5  3.9982  964.56  3.9982  1047.5  3.9982  1210.4  3.9982  1087.5  3.9982  1151.5  3.9982  1096.5  3.9982  957.56  3.9982  1073.5  3.9982  925.57  3.9982  1051.5  3.9982  930.57  3.9982  1005.5  3.9982  977.55  3.9982  963.56  3.9982  1005.5  3.9982  954.56  3.9982  1025.5  3.9982  1039.5  3.9982  985.55  3.9982  923.58  3.9982  1087.5  3.9982  958.56  3.9982  1066.5  3.9982  1110.5  3.9982  934.57  3.9982  946.56  3.9982
 │    │    │    │    │    │    │    │    │    │                 <---- 23 --------- 901 --------- 2150 -------- 3016 -------- 4093 -------- 5038 -------- 5962 -------- 6778 -------- 8056 -------- 9277 -------- 10530 -------- 11769 -------- 13020 -------- 14001 -------- 14982 -------- 16046 -------- 17072 -------- 18149 -------- 18935 -------- 19920 -------- 20876 -------- 21953 -------- 22859 -------- 23908 -------- 24923 -------- 25938 -------- 26865 -------- 27943 -------- 28938 -------- 29813 -------- 30844 -------- 31647 -------- 32585 -------- 33704 -------- 34617 -------- 35448 -------- 36338 ------- 37071 -------- 38029 -------- 39162 -------- 40163 -------- 41103 -------- 42008 -------- 42828 -------- 43789 -------- 44720 -------- 45920 -------- 47197 -------- 48149 -------- 49054 -------- 49906 -------- 51054 -------- 51940 -------- 53144 -------- 54301 -------- 55267 -------- 56318 -------- 57393 -------- 58223 -------- 59046 -------- 59995 -------- 61150 -------- 62024 -------- 62915 -------- 63943 -------- 65015 -------- 65840 -------- 66748 -------- 67584 -------- 68611 -------- 69729 -------- 70883 -------- 71725 -------- 72926 -------- 73924 -------- 74891 -------- 76176 -------- 77264 -------- 78405 -------- 79257 -------- 80310 -------- 81321 -------- 82270 -------- 83162 -------- 84049 -------- 85004 -------- 86255 -------- 87262 -------- 88259 -------- 89276 -------- 90374 -------- 91493 -------- 92454 -------- 93310 -------- 94246 -------- 95407 -------- 96295 -------- 97113 -------- 98069 -------- 98991 -------- 100116 ------- 100871 -------- 101805 -------- 102871 -------- 103776 ------- 104536 -------- 105497 -------- 106526 ------- 107293 -------- 108529 -------- 109518 -------- 110802 -------- 111761 -------- 113044 -------- 113923 -------- 115027 -------- 116119 ------- 116867 -------- 117681 -------- 118553 -------- 119501 -------- 120563 -------- 121563 -------- 122437 -------- 123400 -------- 124288 -------- 125209 -------- 126234 -------- 127465 -------- 128356 -------- 129458 -------- 130604 -------- 131668 ------- 132428 -------- 133365 -------- 134403 -------- 135446 ------- 136179 -------- 137262 -------- 138380 -------- 139242 -------- 140134 -------- 141190 -------- 142146 -------- 143244 -------- 144097 -------- 145011 -------- 145982 -------- 146981 -------- 148207 -------- 149115 -------- 150119 -------- 151183 -------- 152627 -------- 153735 -------- 154585 -------- 155535 -------- 156315 -------- 157258 -------- 158494 -------- 159570 -------- 160487 -------- 161464 -------- 162446 -------- 163673 -------- 164509 -------- 165550 -------- 166548 -------- 167495 -------- 168601 -------- 169889 -------- 170916 -------- 172026 -------- 173351 -------- 174278 -------- 175359 -------- 176720 -------- 177872 -------- 179135 -------- 180304 -------- 181217 -------- 182345 -------- 183194 -------- 184282 -------- 185142 -------- 186147 -------- 187099 -------- 188024 -------- 189029 -------- 189936 -------- 190977 -------- 192044 -------- 193012 -------- 193858 -------- 195011 -------- 195927 -------- 197043 -------- 198236 -------- 199104 -------- 199995
 │    │    │    │    │    │    │    │    │    │   histogram(22)=  0     7640     1.843e+05     8060
 │    │    │    │    │    │    │    │    │    │                 <--- 'Brand#11' ----------- 'Brand#55'
 │    │    │    │    │    │    │    │    │    │   histogram(25)=  0     5460      1.8978e+05     4760
 │    │    │    │    │    │    │    │    │    │                 <--- 'JUMBO BAG' ------------ 'WRAP PKG'
 │    │    │    │    │    │    │    │    │    ├── key: (19)
 │    │    │    │    │    │    │    │    │    ├── fd: (19)-->(22,25)
 │    │    │    │    │    │    │    │    │    └── ordering: +19
 │    │    │    │    │    │    │    │    └── filters
 │    │    │    │    │    │    │    │         ├── p_brand:22 = 'Brand#23' [type=bool, outer=(22), constraints=(/22: [/'Brand#23' - /'Brand#23']; tight), fd=()-->(22)]
 │    │    │    │    │    │    │    │         └── p_container:25 = 'MED BOX' [type=bool, outer=(25), constraints=(/25: [/'MED BOX' - /'MED BOX']; tight), fd=()-->(25)]
 │    │    │    │    │    │    │    └── filters (true)
 │    │    │    │    │    │    └── filters (true)
 │    │    │    │    │    └── aggregations
 │    │    │    │    │         └── avg [as=avg:48, type=float, outer=(34)]
 │    │    │    │    │              └── l_quantity:34 [type=float]
 │    │    │    │    └── projections
 │    │    │    │         └── avg:48 * 0.2 [as="?column?":49, type=float, outer=(48), immutable]
 │    │    │    └── filters (true)
 │    │    └── filters
 │    │         └── l_quantity:5 < "?column?":49 [type=bool, outer=(5,49), constraints=(/5: (/NULL - ]; /49: (/NULL - ])]
 │    └── aggregations
 │         └── sum [as=sum:50, type=float, outer=(6)]
 │              └── l_extendedprice:6 [type=float]
 └── projections
      └── sum:50 / 7.0 [as=avg_yearly:51, type=float, outer=(50)]

----Stats for q17_project_1----
column_names  row_count  distinct_count  null_count
{avg_yearly}  1          1               0
~~~~
column_names  row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{avg_yearly}  1.00           1.00           1.00                1.00                0.00            1.00

----Stats for q17_scalar_group_by_2----
column_names  row_count  distinct_count  null_count
{sum}         1          1               0
~~~~
column_names  row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{sum}         1.00           1.00           1.00                1.00                0.00            1.00

----Stats for q17_lookup_join_3----
column_names       row_count  distinct_count  null_count
{?column?}         587        185             0
{l_extendedprice}  587        430             0
{l_partkey}        587        195             0
{l_quantity}       587        6               0
{p_partkey}        587        195             0
~~~~
column_names       row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{?column?}         2009.00        3.42 <==       200.00              1.08                0.00            1.00
{l_extendedprice}  2009.00        3.42 <==       2007.00             4.67 <==            0.00            1.00
{l_partkey}        2009.00        3.42 <==       200.00              1.03                0.00            1.00
{l_quantity}       2009.00        3.42 <==       50.00               8.33 <==            0.00            1.00
{p_partkey}        2009.00        3.42 <==       200.00              1.03                0.00            1.00

----Stats for q17_lookup_join_4----
column_names    row_count  distinct_count  null_count
{?column?}      6088       194             0
{l_linenumber}  6088       7               0
{l_orderkey}    6088       6088            0
{l_partkey}     6088       204             0
{p_partkey}     6088       204             0
~~~~
column_names    row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{?column?}      6027.00        1.01           200.00              1.03                0.00            1.00
{l_linenumber}  6027.00        1.01           7.00                1.00                0.00            1.00
{l_orderkey}    6027.00        1.01           6015.00             1.01                0.00            1.00
{l_partkey}     6027.00        1.01           200.00              1.02                0.00            1.00
{p_partkey}     6027.00        1.01           200.00              1.02                0.00            1.00

----Stats for q17_project_5----
column_names  row_count  distinct_count  null_count
{?column?}    204        194             0
{p_partkey}   204        204             0
~~~~
column_names  row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{?column?}    200.00         1.02           200.00              1.03                0.00            1.00
{p_partkey}   200.00         1.02           200.00              1.02                0.00            1.00

----Stats for q17_group_by_6----
column_names  row_count  distinct_count  null_count
{avg}         204        194             0
{p_partkey}   204        204             0
~~~~
column_names  row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{avg}         200.00         1.02           200.00              1.03                0.00            1.00
{p_partkey}   200.00         1.02           200.00              1.02                0.00            1.00

----Stats for q17_lookup_join_7----
column_names   row_count  distinct_count  null_count
{l_partkey}    6088       204             0
{l_quantity}   6088       50              0
{p_brand}      6088       1               0
{p_container}  6088       1               0
{p_partkey}    6088       204             0
~~~~
column_names   row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{l_partkey}    6027.00        1.01           200.00              1.02                0.00            1.00
{l_quantity}   6027.00        1.01           50.00               1.00                0.00            1.00
{p_brand}      6027.00        1.01           1.00                1.00                0.00            1.00
{p_container}  6027.00        1.01           1.00                1.00                0.00            1.00
{p_partkey}    6027.00        1.01           200.00              1.02                0.00            1.00

----Stats for q17_lookup_join_8----
column_names    row_count  distinct_count  null_count
{l_linenumber}  6088       7               0
{l_orderkey}    6088       6088            0
{l_partkey}     6088       204             0
{p_brand}       6088       1               0
{p_container}   6088       1               0
{p_partkey}     6088       204             0
~~~~
column_names    row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{l_linenumber}  6027.00        1.01           7.00                1.00                0.00            1.00
{l_orderkey}    6027.00        1.01           6015.00             1.01                0.00            1.00
{l_partkey}     6027.00        1.01           200.00              1.02                0.00            1.00
{p_brand}       6027.00        1.01           1.00                1.00                0.00            1.00
{p_container}   6027.00        1.01           1.00                1.00                0.00            1.00
{p_partkey}     6027.00        1.01           200.00              1.02                0.00            1.00

----Stats for q17_select_9----
column_names   row_count  distinct_count  null_count
{p_brand}      204        1               0
{p_container}  204        1               0
{p_partkey}    204        204             0
~~~~
column_names   row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{p_brand}      200.00         1.02           1.00                1.00                0.00            1.00
{p_container}  200.00         1.02           1.00                1.00                0.00            1.00
{p_partkey}    200.00         1.02           200.00              1.02                0.00            1.00

----Stats for q17_scan_10----
column_names   row_count  distinct_count  null_count
{p_brand}      200000     25              0
{p_container}  200000     40              0
{p_partkey}    200000     199241          0
~~~~
column_names   row_count_est  row_count_err  distinct_count_est  distinct_count_err  null_count_est  null_count_err
{p_brand}      200000.00      1.00           25.00               1.00                0.00            1.00
{p_container}  200000.00      1.00           40.00               1.00                0.00            1.00
{p_partkey}    200000.00      1.00           199241.00           1.00                0.00            1.00
----
----
