Oracle Bucketing Values - PullRequest
       13

Oracle Bucketing Values

1 голос
/ 04 августа 2011

Я пытаюсь написать запрос, чтобы получить количество значений в разных диапазонах.

Допустим, в моей таблице есть столбец с именем '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 Ответ

2 голосов
/ 04 августа 2011

Для первого запроса, если вам все равно, получите ли вы одну строку с тремя столбцами или три строки с одним столбцом, вы можете сделать что-то вроде

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
...