"截然不同的"与postgres组

时间:2017-06-28 14:13:12

标签: sql postgresql group-by distinct-on

我有以下记录:

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;分组?

2 个答案:

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