【问题标题】:Strange behaviour when using FILTER clause使用 FILTER 子句时的奇怪行为
【发布时间】:2017-04-04 12:36:45
【问题描述】:

我有两个问题

SELECT COUNT(DISTINCT keyword_id),
  date_trunc('month', rank_date) AS date
  FROM keyword_ranks, keywords
  WHERE keywords.deleted_at IS NULL
  AND keywords.id=keyword_ranks.keyword_id 
  AND keywords.business_id=27 GROUP BY date_trunc('month', rank_date);

结果集是

现在我添加了一些FILTER 子句,例如

SELECT COUNT(DISTINCT keyword_id) FILTER (WHERE rank>50 OR rank is null) AS "50+",
  COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 21 AND 50) AS "21-50",
  COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 11 AND 20) AS "11-20",
  COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 4 AND 10) AS "4-10",
  COUNT(DISTINCT keyword_id) FILTER (WHERE rank BETWEEN 1 AND 3) AS "1-3",
  date_trunc('month', rank_date) AS date
  FROM keyword_ranks, keywords
  WHERE keywords.deleted_at IS NULL
  AND keywords.id=keyword_ranks.keyword_id 
  AND keywords.business_id=27 GROUP BY date_trunc('month', rank_date);

结果集是什么

从第一个查询结果可以看出,每个月不同keyword_id的计数是147。但是为什么使用FILTER子句时的计数加起来超过147?如果这不是获得不同计数的方式,该怎么做。请耐心等待我的新手问题。非常感谢任何帮助

【问题讨论】:

  • 因为有些关键词出现在同一个月,排名不同。
  • @GordonLinoff 感谢您的快速回复。我想在给定的时间段内获得 50+、21-50、11-20 ..... 排名的不同计数 - 比如说每月..我应该如何重写我的查询
  • 您需要先按关键字进行汇总,然后决定该关键字的排名。

标签: sql performance postgresql


【解决方案1】:

id 在一个等级中是不同的,但在总数中是不同的。检查这个例子:

with v (id, rank) as (values (1,1),(1,10))
select
    count(distinct id) as total,
    count(distinct id) filter (where rank < 10) as "< 10",
    count(distinct id) filter (where rank >= 10) as ">= 10"
from v
;
 total | < 10 | >= 10 
-------+------+-------
     1 |    1 |     1

使排名总和与总数匹配的唯一方法是不使用distinct。

with v (id, rank) as (values (1,1),(1,10))
select
    count(id) as total,
    count(id) filter (where rank < 10) as "< 10",
    count(id) filter (where rank >= 10) as ">= 10"
from v
;
 total | < 10 | >= 10 
-------+------+-------
     2 |    1 |     1

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 2017-09-08
    • 2012-06-28
    • 2017-03-29
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多