根据列获得不同的结果并满足条件

Roc*_*nja 1 postgresql postgresql-9.2 postgresql-9.3

我有以下选择,它是从带有列的表中选择的:

id、project_id、keyword_id、位置、数据示例:

i, p_id, k_id, p 
1,  1,    1,   4
2,  1,    1,   5
3,  1,    1,   6
5,  1,    2,   7
6,  1,    2,   8
7,  1,    3,   5
8,  1,    3,   7
Run Code Online (Sandbox Code Playgroud)

询问

SELECT
  pr.project_id,
  COUNT(DISTINCT pr.keyword_id) as total_keywords,
  COUNT(CASE WHEN position BETWEEN 4 AND 10 THEN position ELSE NULL END ) AS pos4,
  date(pr.created_at) AS created_at
FROM
  project_reports pr
GROUP BY pr.project_id, date(created_at)
Run Code Online (Sandbox Code Playgroud)

我只想在 pos 4-10 中获取不同的 keyword_id 的数量。但是使用我的SELECT我得到了所有这些。

预期数据示例:

p_id, total_keywords, pos4
1,      3,            3
Run Code Online (Sandbox Code Playgroud)

我当前的数据输出

p_id, total_keywords, pos4
1,      3,             7
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

如果您想要不同的关键字,那么您需要计算keyword_id,而不是position列。

所以你的表达:

COUNT(CASE WHEN position BETWEEN 4 AND 10 THEN position ELSE NULL END )
Run Code Online (Sandbox Code Playgroud)

变成:

COUNT(distinct CASE WHEN position BETWEEN 4 AND 10 THEN keyword_id ELSE NULL END )
Run Code Online (Sandbox Code Playgroud)

所以最后的声明是:

SELECT
  pr.project_id,
  COUNT(DISTINCT pr.keyword_id) as total_keywords,
  count(distinct CASE WHEN position BETWEEN 4 AND 10 THEN keyword_id ELSE NULL END ) AS pos4
FROM
  project_reports pr
GROUP BY pr.project_id;
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 示例:http ://sqlfiddle.com/#!15/b1015/1