考虑如下表字段。
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;