1

さまざまな範囲の値の数を取得するクエリを作成しようとしています。

私のテーブルに「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.

クエリは結果を表示しますが、veeeeeerrrrrySLOWを実行しているようです。

これを行うためのより良い方法はありますか?

他の列もあるので、「値」列の値に基づいてテーブルを分割できないことを覚えておいてください。

編集

上記のクエリを次のように変更します

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

1 に答える 1

2

最初のクエリでは、3列の1行を取得するか、1列の3行を取得するかを気にしないと仮定すると、次のようになります。

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

これにより、テーブルを3回スキャンするのではなく、1回スキャンできます。

一般に、2番目のクエリは異なる結果セットを返します。2番目のクエリを別のクエリと一致させることができます

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
于 2011-08-04T13:35:14.470 に答える