java - 如何按间隔对结果进行分组?

标签 java sql hibernate group-by

我有一个包含具有“速度”属性的事件的表。

为了查看此属性的统计分布,我想按间隔对结果进行分组,比方说:

[0-49.99km/h] 3 objects
[50-100km/h] 13 objects
[100-150km/h] 50 objects
etc

这会让我看到大多数对象都在某个区间内。

显然,这可以通过使用适当的 Where 条件的多个查询来完成,例如:

从 GaEvent a 中选择计数,其中速度 >= MIN 且速度 < MAX

但这是非常低效的。 是否有更好的方法来对这些值进行分组?

干杯!

最佳答案

仅在 SQL 中解决此问题的一种更有效的方法是将有问题的表与派生表连接起来,该派生表包含您希望在直方图中显示的最小值和最大值。

例如:

select t.min, t.max, count(*)
from  (
    select 0 as min, 14.9 as max
    union 
    select 15, 29.9
    union
    select 30, 44.9
    union ...
) t
left outer join cars c on c.speed between t.min and t.max
group by t.min, t.max
order by t.min

min | max  | count
-----------------
 0  | 14.9 | 1
 15 | 29.9 | 1
 30 | 44.9 | 2

这在很大程度上取决于您使用的是哪个数据库供应商。比如PostgreSQL有一个概念window functions这可能会大大简化此类查询,并避免您需要自己生成“直方图表”。

虽然谈到 Hibernate,Projections 的方式似乎很少。和 support for aggregrate functions这适用于任何类似的事情。这很可能是您想要使用原始 SQL 进行查询和/或在 Java 本身中进行计算的场景。

关于java - 如何按间隔对结果进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3398488/

相关文章:

mysql - 如何使 sql 查询在 mysql 中的日期范围内每天返回一行?

java - org.hibernate.AnnotationException : Unknown Id. 生成器:GenreIdGenerator

java - 我如何读取 XX :MaxPermSize during runtime?

java - Spring Boot 不运行单元测试

sql - 使用来自另一个表的查询结果值向表中插入一行

java - 警告[CommonsLogger.java :60] ognl. MethodFailedException : Method failed for object [java. lang.NoSuchMethodException :([Ljava. lang.String;)]

spring - Postgresql 和 Spring Roo 为 ID 绑定(bind)序列类型

java - 所有非垃圾收集的对象最终都是静态引用的吗?

java - 重新部署项目后,存储在 session 中的对象将不匹配同一类

php - Laravel Eloquent,按月/年分组