【问题标题】:Replace nested query to single select query将嵌套查询替换为单选查询
【发布时间】:2014-11-19 19:14:21
【问题描述】:

考虑如下表字段。

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;

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

【问题讨论】:

  • 与往常一样,表定义将有助于澄清。还有你的 Postgres 版本。

标签: sql postgresql count duplicates aggregate-functions


【解决方案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 查询中的事件顺序非常重要:

【讨论】:

  • 感谢您的回答。其中哪个更快,为什么?能简单解释一下吗?
  • @Kranthi:我希望最后一个最快,紧随其后的是第一个。第二个内部更复杂。这实际上取决于您的确切表定义、基数、数据分布、典型使用模式等。这些都不是您的问题。使用EXPLAIN (ANALYZE, TIMING OFF) 进行测试,比较最好的 5 个左右以排除缓存和一次性效果。如果您需要最佳性能,匹配索引可能会有所帮助。如果您想深入探讨这一点,我建议您开始一个包含详细信息的新问题。您可以随时链接到这个以供参考。
【解决方案2】:

表中唯一真实 Appid 的总数

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

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

【讨论】:

  • 感谢您的回复。您的回答有助于解决问题。但根据我的要求,需要添加不同的 appid 和 client_name。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2023-01-11
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多