package my.test.expression;
import my.test.TestBase;
public class AggregateTest extends TestBase {
public static void main(String[] args) throws Exception {
new AggregateTest().start();
}
//测试org.h2.command.Parser.readAggregate(int)
//org.h2.expression.Aggregate
@Override
public void startInternal() throws Exception {
stmt.executeUpdate("drop table IF EXISTS AggregateTest");
stmt.executeUpdate("create table IF NOT EXISTS AggregateTest(id int, name varchar(500))");
// stmt.executeUpdate("ALTER TABLE AggregateTest ALTER COLUMN id SELECTIVITY 10");
// stmt.executeUpdate("ALTER TABLE AggregateTest ALTER COLUMN name SELECTIVITY 10");
// stmt.executeUpdate("ALTER TABLE AggregateTest ADD CONSTRAINT NAME_UNIQUE UNIQUE(name,id)");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(1, 'a1')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(1, 'b1')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(2, 'a2')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(2, 'b2')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(3, 'a3')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(3, 'b3')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(1, 'a1')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(2, 'b1')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(3, 'a2')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(1, 'b2')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(2, 'a3')");
// stmt.executeUpdate("insert into AggregateTest(id, name) values(3, 'b3')");
//
stmt.executeUpdate("insert into AggregateTest(id, name) values(1, 'a1')");
stmt.executeUpdate("insert into AggregateTest(id, name) values(3, 'b1')");
stmt.executeUpdate("insert into AggregateTest(id, name) values(5, 'a2')");
stmt.executeUpdate("insert into AggregateTest(id, name) values(7, 'b2')");
stmt.executeUpdate("insert into AggregateTest(id, name) values(9, 'a3')");
stmt.executeUpdate("insert into AggregateTest(id, name) values(11, 'b3')");
// for(int i=1;i<=30;i++)
// stmt.executeUpdate("insert into AggregateTest(id, name) values("+i+", 'a2')");
sql = "select distinct name from AggregateTest";
sql = "select count(*) from AggregateTest";
//不允许这样
sql = "select count(DISTINCT *) from AggregateTest";
//只能这样
//但是h2似乎有bug(注:应该不是bug,AggregateTest.*是所有字段,加DISTINCT它并不知道要应用于哪个字段
sql = "select count(DISTINCT AggregateTest.*) from AggregateTest";
sql = "select count(AggregateTest.*) from AggregateTest"; //这样就没问题
sql = "select count(DISTINCT AggregateTest.name) from AggregateTest"; //这样也没问题
sql = "select GROUP_CONCAT(DISTINCT name ORDER BY id SEPARATOR ',') from AggregateTest"; //这样也没问题
//sql = "select sum(DISTINCT id) from AggregateTest"; //这样也没问题
//sql = "select HISTOGRAM(id) from AggregateTest";
sql = "select SELECTIVITY(id) from AggregateTest";
sql = "select ABS(id) from AggregateTest";
sql = "select ABS(SELECTIVITY(id)) from AggregateTest";
//sql = "select ABS(SELECTIVITY(id)) from AggregateTest where max(id)>9"; //聚合函数不能用于Where中
sql = "select id,count(id) from AggregateTest group by id having max(id)>9"; //但是可以用于having中
sql = "select STDDEV_POP(id),STDDEV_SAMP(id),VAR_POP(id),VAR_SAMP(id) from AggregateTest where id=11";
sql = "select STDDEV_POP(id),STDDEV_SAMP(id),VAR_POP(id),VAR_SAMP(id) from AggregateTest where id>=7";
executeQuery();
//std_var()
}
void std_var() throws Exception {
sql = "select STDDEV_POP(id) from AggregateTest where id>1";
sql = "select STDDEV_POP(id) from AggregateTest where id<=5";
sql = "select STDDEV_POP(id) from AggregateTest where id between 1 and 10";
sql = "select STDDEV_POP(id) from AggregateTest"; //3.415650255319866
sql = "select STDDEV_SAMP(id) from AggregateTest"; //3.7416573867739413
sql = "select VAR_POP(id) from AggregateTest"; //11.666666666666666
sql = "select VAR_SAMP(id) from AggregateTest"; //14.0
sql = "select count(id),sum(id),sum(id*id) from AggregateTest where id between 1 and 5";
rs = stmt.executeQuery(sql);
int count = 0;
double sum = 0;
double sum2 = 0;
while (rs.next()) {
count += rs.getInt(1);
sum += rs.getInt(2);
sum2 += rs.getInt(3);
}
sql = "select count(id),sum(id),sum(id*id) from AggregateTest where id between 7 and 11";
rs = stmt.executeQuery(sql);
while (rs.next()) {
count += rs.getInt(1);
sum += rs.getInt(2);
sum2 += rs.getInt(3);
}
//STDDEV_POP 3.415650255319866
System.out.println(Math.sqrt(sum2 / count - (sum / count) * (sum / count)));
//STDDEV_SAMP 3.7416573867739413
//见:http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
System.out.println(Math.sqrt((sum2 - (sum * sum / count)) / (count - 1)));
//VAR_POP 11.666666666666664
System.out.println(sum2 / count - (sum / count) * (sum / count));
//VAR_SAMP 14.0
System.out.println((sum2 - (sum * sum / count)) / (count - 1));
// sql = "select STDDEV_POP(id) from AggregateTest where id between 11 and 20";
// executeQuery();
//
// sql = "select STDDEV_POP(id) from AggregateTest where id between 21 and 30";
// executeQuery();
}
}