我想创建表格单列中值的直方图,并且我已经知道该列的所有可能值
所以,在伪sql中,我想做这样的事情:
select
count(my_col where my_col == "val_1") as "count_for_val_1",
count(my_col where my_col == "val_2") as "count_for_val_2",
etc
需要注意的是,我想在 joog 中使用这种查询构建风格,因为它使条件构建更容易:
SelectQuery query = context.selectQuery();
query.addSelect(...)
query.addFrom(...)
etc
更新:好的,这似乎有效:
SelectQuery query = context.selectQuery();
query.addSelect(my_table.my_col.decode("val_1", "any string here?").count().as("count_for_val_1"));
query.addSelect(my_table.my_col.decode("val_2", "any string here?").count().as("count_for_val_2"));
etc
现在,在 JOOQ 中执行此操作的最佳方法是什么?有这么多...
最佳答案
您可以使用 jOOQ 的 filterWhere()
函数,可与所有聚合函数一起使用。即
DSL.using(configuration)
.select(
count().filterWhere(MY_COL.eq("val_1")).as("count_for_val_1"),
count().filterWhere(MY_COL.eq("val_2")).as("count_for_val_2"),
...
)
.from(...)
SQL 标准指定了 AGGREGATE(...) FILTER (WHERE ...)
语法,PostgreSQL 本身支持该语法:
SELECT
count(*) FILTER (WHERE my_col = 'val_1') AS "count_for_val_1",
count(*) FILTER (WHERE my_col = 'val_2') AS "count_for_val_2",
...
FROM ...
在所有其他数据库中,jOOQ 将生成以下内容
SELECT
count(CASE WHEN my_col = 'val_1' THEN 1 END) AS "count_for_val_1",
count(CASE WHEN my_col = 'val_2' THEN 1 END) AS "count_for_val_2",
...
FROM ...
关于java - 使用 jooq 创建直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21354496/