SELECT
externalsource.id,
externalsource.url,
externalsource.last_fetch,
SUM(scripttracking.records) AS jobs_per_week
FROM
scripttracking
RIGHT JOIN
externalsource
ON
externalsource.script_name = scripttracking.script_name
AND
scripttracking.created_on > %s
GROUP BY
externalsource.id
任何想法如何修改此查询以便它将使用不同的“AND”条件聚合scripttracking.records?
基本上,我需要得到的是:
SUM(scripttracking.records) for scripttracking.created_on > now() - 1 week
SUM(scripttracking.records) for scripttracking.created_on > now() - 1 month
SUM(scripttracking.records) for scripttracking.created_on > now() - 1 year
我需要在1个结果查询集中包含所有这些字段。
类似的东西:
ID, URL, LAST_FETCH, JOBS_PER_WEEK, JOBS_PER_MONTH, JOBS_PER_YEAR
1, http://google.ru, 25/01/2016, 7, 23, 8889
答案 0 :(得分:4)
传统上我们会使用CASE
声明,但Postgres为我们提供了更舒适的解决方案,因此最好使用FILTER
SELECT
externalsource.id
,externalsource.url
,externalsource.last_fetch
,SUM(scripttracking.records) AS jobs_per_week
,SUM(scripttracking.records) FILTER (WHERE scripttracking.created_on > now() - 1 week)
,SUM(scripttracking.records) FILTER (WHERE scripttracking.created_on > now() - 1 month)
,SUM(scripttracking.records) FILTER (WHERE scripttracking.created_on > now() - 1 year)
FROM
scripttracking
RIGHT JOIN
externalsource
ON
externalsource.script_name = scripttracking.script_name
AND
scripttracking.created_on > %s
GROUP BY
externalsource.id
答案 1 :(得分:3)
使用case语句来计算要求的值,否则使用0。
请注意,这是包含逻辑,因此月份总和包含一周的总和,而年份的总和包含一些星期和月份。
SELECT
externalsource.id,
externalsource.url,
externalsource.last_fetch,
SUM(case when scripttracking.created_on > now() - 1 week then scripttracking.records else 0 end) AS jobs_per_week,
SUM(case when scripttracking.created_on > now() - 1 month then scripttracking.records else 0 end) AS jobs_per_Month,
SUM(case wehn scripttracking.created_on > now() - 1 year then scripttracking.records else 0 end) AS jobs_per_Year
FROM
scripttracking
RIGHT JOIN
externalsource
ON
externalsource.script_name = scripttracking.script_name
AND
scripttracking.created_on > %s
GROUP BY
externalsource.id
答案 2 :(得分:0)
您可以简单地使用case语句来获取不同列的聚合。 简而言之,这可以写成:
SELECT
externalsource.id,
externalsource.url,
externalsource.last_fetch,
SUM(scripttracking.records) for scripttracking.created_on > now() [JOBS_PER_WEEK],
SUM(scripttracking.records) for scripttracking.created_on > now() [JOBS_PER_MONTH],
SUM(scripttracking.records) for scripttracking.created_on > now() [JOBS_PER_YEAR]
from
..... your rest of your query goes here.