Oracle Bucketing值

时间:2011-08-04 13:21:41

标签: range bucket oracle11gr2

我正在尝试编写一个查询来获取不同范围内的值计数。

我们说我的表有一个名为'Name'的列和另一个名为'Value'的列,它是数字。

“值”列可以取1到100之间的值。

目前我正在撰写像

这样的查询
select count(1) from table where value between 1 and 10
union all
select count(1) from table where value between 11 and 80
union all
select count(1) from table where value between 81 and 100.

查询给了我结果,但似乎执行了veeeeeerrrrry SLOW。

有更好的方法吗?

请记住,我不能根据“值”列中的值对表进行分区,因为我还有其他列。

修改

好的我打算将上面的查询修改为

select count(distinct names) from table where value between 1 and 10
union all
select count(distinct names) from table where value between 11 and 80
union all
select count(distinct names) from table where value between 81 and 100.

1 个答案:

答案 0 :(得分:2)

对于您的第一个查询,假设您不关心是否有一行包含三列或三行包含一列,您可以执行类似

的操作
SELECT SUM( CASE WHEN value BETWEEN 1 AND 10
                 THEN 1
                 ELSE 0
             END) num_between_1_and_10,
       SUM( CASE WHEN value BETWEEN 11 AND 80
                 THEN 1
                 ELSE 0
             END) num_between_11_and_80,
       SUM( CASE WHEN value BETWEEN 81 AND 100
                 THEN 1
                 ELSE 0
             END) num_between_81_and_100
  FROM table_name

这将让您扫描一次而不是扫描它三次。

第二个查询通常会返回不同的结果集。您可以将第二个查询与其他查询匹配

SELECT COUNT( DISTINCT( CASE WHEN value BETWEEN 1 AND 10
                             THEN name
                             ELSE null
                         END) ) num_distinct_between_1_and_10,
       COUNT( DISTINCT( CASE WHEN value BETWEEN 11 AND 80
                             THEN name
                             ELSE null
                         END) ) num_distinct_between_11_and_80,
       COUNT( DISTINCT( CASE WHEN value BETWEEN 81 AND 100
                             THEN name
                             ELSE null
                         END) ) num_distinct_between_81_and_100
  FROM table_name