将嵌套查询替换为单选查询

时间:2014-11-19 19:14:22

标签: sql postgresql count duplicates aggregate-functions

考虑表格字段如下。

Appid       Client_name          is_real     RTT
100         C1                   1           1
200         C1                   1           6
200         C2                   1           7
100         C1                   1           9
200         C1                   0           7

现在我需要表中唯一真实Appid的总数。如果'is_real'为1,我们可以说一个appid记录是真实的。 在上表中,我们只有3个真正的Appid。其中(100,C1),(200,C1)和(200,C2)。

Postgesql命令:

Select sum(r) 
from (select count(is_real) as r from table group by Appid, Client_name) as t;

我不想要任何递归查询。如果您可以使用单个选择查询进行提取,那将会很有帮助。

2 个答案:

答案 0 :(得分:1)

  

表格中唯一真实Appid的总数

我认为is_real是1 =真,0 =假。

SELECT COUNT(DISTINCT Appid)
FROM table
WHERE is_real = 1;

答案 1 :(得分:1)

由于您似乎通过(Appid, Client_name)定义了一个唯一ID(由于您混合使用条款,因此会让您感到困惑):

SELECT COUNT(DISTINCT (Appid, Client_name)) AS ct
FROM   tbl
WHERE  is_real = 1;

(Appid, Client_name)是行类型表达式,是ROW(Appid, Client_name)的缩写。只计算不同的组合

完成此操作的另一个技巧没有子查询是使用窗口函数:

SELECT DISTINCT count(*) OVER () AS ct
FROM   tbl
WHERE  is_real = 1
GROUP  BY Appid, Client_name;

但两者都不会比使用子查询(递归查询)更快:

SELECT count(*) AS ct
FROM  (
   SELECT 1
   FROM   tbl
   WHERE  is_real = 1
   GROUP  BY Appid, Client_name
   ) sub;

这就是我要用的。

理解SELECT查询中的事件序列至关重要: