java - 使用 jooq 创建直方图

标签 java sql histogram jooq

我想创建表格单列中值的直方图,并且我已经知道该列的所有可能值

所以,在伪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/

相关文章:

java - 做 !(!a && b) 比 || 效率低吗!乙?

sql - 每个表使用多个索引是否危险?

sql - 从oracle中选择随机样本时两个查询之间的区别

c - 尝试在 C 中使用 cvCreateHist 时检测到 glibc

java - 在一个路径中一起解析符号链接(symbolic link)和 ".."

Java:是否有一种数据结构可以像多重映射一样工作,但接受重复的键?

java - Android 应用程序在访问本地主机时崩溃

sql - postgresql - 从表中获取有序数组

image-processing - 基于内容的图像检索的直方图比较。不同的颜色空间(RGB、HSV 等)

r - R直方图-频率范围