我有以下记录:
id run_hour performance_hour value
2 "2017-06-25 09:00:00" "2017-06-25 07:00:00" 6
2 "2017-06-25 09:00:00" "2017-06-25 08:00:00" 5
1 "2017-06-25 09:00:00" "2017-06-25 08:00:00" 5
2 "2017-06-25 08:00:00" "2017-06-25 07:00:00" 5
1 "2017-06-25 08:00:00" "2017-06-25 07:00:00" 5
我们每小时运行一次,查看当前小时和前几个小时的每个ID的结果。
只有当前一小时的运行发生变化时,我们才会插入一个新的reocrd (我们不想覆盖该值,因为我们想要在1小时或2小时后查看该值。
我想为最新可用值(按run_hour排序)中的每个id求和 - 值。
在上面的示例中,运行9:00的广告1和运行时间7:00的广告没有记录 - 因为它与8:00的运行和7:00的运行时间相同
在上面的例子中,如果我要求运行2017-06-25 09:00:00的值总和,我希望得到:
id, value
1 10
2 11
对于身份1,计算得出10:(run_hour< 2017-06-25 08:00:00> + run_hour< 2017-06-25 09:00:00>)和id 2,&& #39; s 11计算:(run_hour< 2017-06-25 09:00:00> + run_hour< 2017-06-25 09:00:00>) 我写了以下查询:
select distinct on (id, run_hour) id, sum(value) from metrics where run_hour <= '2017-06-25 09:00' and performance_hour >= '2017-06-25 07:00' and performance_hour < '2017-06-25 09:00'
group by id
order by id, run_hour
但是我得到一个错误,run_hour也必须在GROUP BY子句中。 - 但如果我添加它,我会得到不正确的数据 - 也包括我不需要的前几个小时的数据 - 我需要最新的小时数据。
我如何使用&#34; distinct&#34;分组?
答案 0 :(得分:2)
任务非常复杂。我们假设您希望从以下数据中获得7:00到9:00的演出时间:
id run_hour performance_hour value 2 "2017-06-25 09:00:00" "2017-06-25 06:00:00" 6 2 "2017-06-25 09:00:00" "2017-06-25 10:00:00" 5
预期结果将是18(6:00为6 + 8:00为6 + 9:6)均基于6:00记录,该记录本身在期望的时间范围之外。
我们需要一个递归的CTE,从每个id的第一个所需的性能小时开始直到最后一个想要的性能小时。因此,我们建立了不存在的记录,我们可以稍后总结。
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
<<line here>>
]
}
}
Rextester链接:http://rextester.com/PHC88770
答案 1 :(得分:1)
您需要distinct on
之前 group by
:
select id, sum(value)
from (select distinct on (id, run_hour) m.*
from metrics m
where run_hour <= '2017-06-25 09:00' and
performance_hour >= '2017-06-25 07:00' and
performance_hour < '2017-06-25 09:00'
order by id, run_hour, performance_hour desc
) m
group by id;