如何在RIGHT JOIN中聚合具有不同AND子句的字段?

时间:2016-01-25 19:23:12

标签: sql django postgresql

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

3 个答案:

答案 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.