aggregates.sql 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. --
  2. -- AGGREGATES
  3. --
  4. -- avoid bit-exact output here because operations may not be bit-exact.
  5. SET extra_float_digits = 0;
  6. SELECT avg(four) AS avg_1 FROM onek;
  7. SELECT avg(a) AS avg_32 FROM aggtest WHERE a < 100;
  8. -- In 7.1, avg(float4) is computed using float8 arithmetic.
  9. -- Round the result to 3 digits to avoid platform-specific results.
  10. SELECT avg(b)::numeric(10,3) AS avg_107_943 FROM aggtest;
  11. SELECT avg(gpa) AS avg_3_4 FROM ONLY student;
  12. SELECT sum(four) AS sum_1500 FROM onek;
  13. SELECT sum(a) AS sum_198 FROM aggtest;
  14. SELECT sum(gpa) AS avg_6_8 FROM ONLY student;
  15. SELECT max(four) AS max_3 FROM onek;
  16. SELECT max(a) AS max_100 FROM aggtest;
  17. SELECT max(aggtest.b) AS max_324_78 FROM aggtest;
  18. SELECT max(student.gpa) AS max_3_7 FROM student;
  19. SELECT stddev_pop(b) FROM aggtest;
  20. SELECT stddev_samp(b) FROM aggtest;
  21. SELECT var_pop(b) FROM aggtest;
  22. SELECT var_samp(b) FROM aggtest;
  23. SELECT stddev_pop(b::numeric) FROM aggtest;
  24. SELECT stddev_samp(b::numeric) FROM aggtest;
  25. SELECT var_pop(b::numeric) FROM aggtest;
  26. SELECT var_samp(b::numeric) FROM aggtest;
  27. -- population variance is defined for a single tuple, sample variance
  28. -- is not
  29. SELECT var_pop(1.0::float8), var_samp(2.0::float8);
  30. SELECT stddev_pop(3.0::float8), stddev_samp(4.0::float8);
  31. SELECT var_pop('inf'::float8), var_samp('inf'::float8);
  32. SELECT stddev_pop('inf'::float8), stddev_samp('inf'::float8);
  33. SELECT var_pop('nan'::float8), var_samp('nan'::float8);
  34. SELECT stddev_pop('nan'::float8), stddev_samp('nan'::float8);
  35. SELECT var_pop(1.0::float4), var_samp(2.0::float4);
  36. SELECT stddev_pop(3.0::float4), stddev_samp(4.0::float4);
  37. SELECT var_pop('inf'::float4), var_samp('inf'::float4);
  38. SELECT stddev_pop('inf'::float4), stddev_samp('inf'::float4);
  39. SELECT var_pop('nan'::float4), var_samp('nan'::float4);
  40. SELECT stddev_pop('nan'::float4), stddev_samp('nan'::float4);
  41. SELECT var_pop('inf'::numeric), var_samp('inf'::numeric);
  42. SELECT stddev_pop('inf'::numeric), stddev_samp('inf'::numeric);
  43. SELECT var_pop('nan'::numeric), var_samp('nan'::numeric);
  44. SELECT stddev_pop('nan'::numeric), stddev_samp('nan'::numeric);
  45. -- verify correct results for null and NaN inputs
  46. select sum(null::int4) from generate_series(1,3);
  47. select sum(null::int8) from generate_series(1,3);
  48. select sum(null::numeric) from generate_series(1,3);
  49. select sum(null::float8) from generate_series(1,3);
  50. select avg(null::int4) from generate_series(1,3);
  51. select avg(null::int8) from generate_series(1,3);
  52. select avg(null::numeric) from generate_series(1,3);
  53. select avg(null::float8) from generate_series(1,3);
  54. select sum('NaN'::numeric) from generate_series(1,3);
  55. select avg('NaN'::numeric) from generate_series(1,3);
  56. -- verify correct results for infinite inputs
  57. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  58. FROM (VALUES ('1'), ('infinity')) v(x);
  59. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  60. FROM (VALUES ('infinity'), ('1')) v(x);
  61. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  62. FROM (VALUES ('infinity'), ('infinity')) v(x);
  63. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  64. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  65. SELECT sum(x::float8), avg(x::float8), var_pop(x::float8)
  66. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  67. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  68. FROM (VALUES ('1'), ('infinity')) v(x);
  69. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  70. FROM (VALUES ('infinity'), ('1')) v(x);
  71. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  72. FROM (VALUES ('infinity'), ('infinity')) v(x);
  73. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  74. FROM (VALUES ('-infinity'), ('infinity')) v(x);
  75. SELECT sum(x::numeric), avg(x::numeric), var_pop(x::numeric)
  76. FROM (VALUES ('-infinity'), ('-infinity')) v(x);
  77. -- test accuracy with a large input offset
  78. SELECT avg(x::float8), var_pop(x::float8)
  79. FROM (VALUES (100000003), (100000004), (100000006), (100000007)) v(x);
  80. SELECT avg(x::float8), var_pop(x::float8)
  81. FROM (VALUES (7000000000005), (7000000000007)) v(x);
  82. -- SQL2003 binary aggregates
  83. SELECT regr_count(b, a) FROM aggtest;
  84. SELECT regr_sxx(b, a) FROM aggtest;
  85. SELECT regr_syy(b, a) FROM aggtest;
  86. SELECT regr_sxy(b, a) FROM aggtest;
  87. SELECT regr_avgx(b, a), regr_avgy(b, a) FROM aggtest;
  88. SELECT regr_r2(b, a) FROM aggtest;
  89. SELECT regr_slope(b, a), regr_intercept(b, a) FROM aggtest;
  90. SELECT covar_pop(b, a), covar_samp(b, a) FROM aggtest;
  91. SELECT corr(b, a) FROM aggtest;
  92. -- check single-tuple behavior
  93. SELECT covar_pop(1::float8,2::float8), covar_samp(3::float8,4::float8);
  94. SELECT covar_pop(1::float8,'inf'::float8), covar_samp(3::float8,'inf'::float8);
  95. SELECT covar_pop(1::float8,'nan'::float8), covar_samp(3::float8,'nan'::float8);
  96. -- test accum and combine functions directly
  97. CREATE TABLE regr_test (x float8, y float8);
  98. INSERT INTO regr_test VALUES (10,150),(20,250),(30,350),(80,540),(100,200);
  99. SELECT float8_accum('{4,140,2900}'::float8[], 100);
  100. SELECT float8_regr_accum('{4,140,2900,1290,83075,15050}'::float8[], 200, 100);
  101. SELECT float8_combine('{3,60,200}'::float8[], '{0,0,0}'::float8[]);
  102. SELECT float8_combine('{0,0,0}'::float8[], '{2,180,200}'::float8[]);
  103. SELECT float8_combine('{3,60,200}'::float8[], '{2,180,200}'::float8[]);
  104. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  105. '{0,0,0,0,0,0}'::float8[]);
  106. SELECT float8_regr_combine('{0,0,0,0,0,0}'::float8[],
  107. '{2,180,200,740,57800,-3400}'::float8[]);
  108. SELECT float8_regr_combine('{3,60,200,750,20000,2000}'::float8[],
  109. '{2,180,200,740,57800,-3400}'::float8[]);
  110. DROP TABLE regr_test;
  111. -- test count, distinct
  112. SELECT count(four) AS cnt_1000 FROM onek;
  113. SELECT count(DISTINCT four) AS cnt_4 FROM onek;
  114. select ten, count(*), sum(four) from onek
  115. group by ten order by ten;
  116. select ten, count(four), sum(DISTINCT four) from onek
  117. group by ten order by ten;
  118. --
  119. -- test for bitwise integer aggregates
  120. --
  121. CREATE TEMPORARY TABLE bitwise_test(
  122. i2 INT2,
  123. i4 INT4,
  124. i8 INT8,
  125. i INTEGER,
  126. x INT2,
  127. y BIT(4)
  128. );
  129. CREATE TEMPORARY TABLE bool_test(
  130. b1 BOOL,
  131. b2 BOOL,
  132. b3 BOOL,
  133. b4 BOOL);
  134. select min(unique1) from tenk1;
  135. select max(unique1) from tenk1;
  136. select max(unique1) from tenk1 where unique1 < 42;
  137. select max(unique1) from tenk1 where unique1 > 42;
  138. -- the planner may choose a generic aggregate here if parallel query is
  139. -- enabled, since that plan will be parallel safe and the "optimized"
  140. -- plan, which has almost identical cost, will not be. we want to test
  141. -- the optimized plan, so temporarily disable parallel query.
  142. begin;
  143. select max(unique1) from tenk1 where unique1 > 42000;
  144. rollback;
  145. select max(tenthous) from tenk1 where thousand = 33;
  146. select min(tenthous) from tenk1 where thousand = 33;
  147. select distinct max(unique2) from tenk1;
  148. select max(unique2) from tenk1 order by 1;
  149. select max(unique2) from tenk1 order by max(unique2);
  150. select max(unique2) from tenk1 order by max(unique2)+1;
  151. select max(100) from tenk1;
  152. -- try it on an inheritance tree
  153. create table minmaxtest(f1 int);
  154. create index minmaxtesti on minmaxtest(f1);
  155. create index minmaxtest1i on minmaxtest1(f1);
  156. create index minmaxtest2i on minmaxtest2(f1 desc);
  157. insert into minmaxtest values(11), (12);
  158. --
  159. -- Test removal of redundant GROUP BY columns
  160. --
  161. create temp table t1 (a int, b int, c int, d int, primary key (a, b));
  162. create temp table t2 (x int, y int, z int, primary key (x, y));
  163. drop table t2;
  164. --
  165. -- Test GROUP BY matching of join columns that are type-coerced due to USING
  166. --
  167. create temp table t1(f1 int, f2 bigint);
  168. create temp table t2(f1 bigint, f22 bigint);
  169. drop table t1, t2;
  170. select array_agg(distinct a)
  171. from (values (1),(2),(1),(3),(null),(2)) v(a);
  172. -- string_agg tests
  173. select string_agg(a,',') from (values('aaaa'),('bbbb'),('cccc')) g(a);
  174. select string_agg(a,',') from (values('aaaa'),(null),('bbbb'),('cccc')) g(a);
  175. select string_agg(a,'AB') from (values(null),(null),('bbbb'),('cccc')) g(a);
  176. select string_agg(a,',') from (values(null),(null)) g(a);
  177. -- string_agg bytea tests
  178. create table bytea_test_table(v bytea);
  179. select string_agg(v, '') from bytea_test_table;
  180. insert into bytea_test_table values(decode('ff','hex'));
  181. select string_agg(v, '') from bytea_test_table;
  182. insert into bytea_test_table values(decode('aa','hex'));
  183. select string_agg(v, '') from bytea_test_table;
  184. select string_agg(v, NULL) from bytea_test_table;
  185. select string_agg(v, decode('ee', 'hex')) from bytea_test_table;
  186. drop table bytea_test_table;
  187. -- outer reference in FILTER (PostgreSQL extension)
  188. select (select count(*)
  189. from (values (1)) t0(inner_c))
  190. from (values (2),(3)) t1(outer_c); -- inner query is aggregation query
  191. select p, percentile_cont(p order by p) within group (order by x) -- error
  192. from generate_series(1,5) x,
  193. (values (0::float8),(0.1),(0.25),(0.4),(0.5),(0.6),(0.75),(0.9),(1)) v(p)
  194. group by p order by p;
  195. -- test aggregates with common transition functions share the same states
  196. begin work;