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



考虑如下表字段。

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;

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

由于您似乎通过(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 查询中的事件顺序至关重要:

  • 在应用 LIMIT 之前获取结果计数的最佳方法

表中唯一真实 Appid 的总数

我假设is_real是 1 = 真,0 = 假。

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

最新更新