1

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

假设我的表有一个名为“名称”的列和另一个名为“值”的列,它是数字的。

“值”列的取值范围为 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.

该查询给了我结果,但似乎执行 veeeeeerrrry 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.
4

1 回答 1

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