考虑表格字段如下。
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;
我不想要任何递归查询。如果您可以使用单个选择查询进行提取,那将会很有帮助。
答案 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查询中的事件序列至关重要: