我有一个包含具有“速度”属性的事件的表。
为了查看此属性的统计分布,我想按间隔对结果进行分组,比方说:
[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/