如果db中的数据有时区偏移,则按day + pair_id进行分组。

问题描述 投票:0回答:1

我有一个服务器,给了我一些按日期分组的信息(我用的是 date_trunc() 为它)。) 因为时区的关系,我知道 2020-06-06 21:00:00 在我的数据库中,实际上是 2020-06-07 00:00:00. 我需要计算列元的总和,按以下方式分组。(tm + pair_id)但由于来自db的偏移数据有 2020-06-06 21:00 tm不与其他 2020-06-07 数据。因此,每项数据的总金额不应作为一个标准。day+pair_id 我有几行相同的 tmpair_id (因为 2020-06-06 21:00 成为 2020-06-07 00:00 在结果中)

我可以在这里固定分组而不创建子请求吗?

我有一个表。

   CREATE TABLE tests.tbl (
    id int4 NULL,
    tm timestamp NULL,
    meta float4 NULL,
    pair_id int4 NULL
);

里面有这些数据

enter image description here

我的查询是:

SELECT 
    pair_id,
    date_trunc('day', min(tm) at time zone '3' at time zone 'UTC') as tm,
    sum(meta)
FROM tests.tbl
WHERE (tm BETWEEN '2020-06-06 21:00:00+00:00:00' AND '2020-06-08 20:59:00+00:00:00')
group by pair_id, tm
order by tm, pair_id;

我的结果是:

enter image description here

预期结果是:

enter image description here

postgresql group-by timestamp timezone tm
1个回答
1
投票

我想你要的逻辑是。

SELECT 
    pair_id,
    date_trunc('day', tm at time zone '3' at time zone 'UTC') as tm,
    sum(meta)
FROM tests.tbl
WHERE tm BETWEEN '2020-06-06 21:00:00+00:00:00' AND '2020-06-08 21:00:00+00:00:00'
GROUP BY 1, 2
ORDER BY 2, 1;

那就是: selectgroup by 子句应该是一致的(特别是,两个子句中的时间戳列应该是偏移的)。

如果把偏移量移到子查询中,可能会更容易理解。

SELECT pair_id, date_trunc('day', tm) as tm, sum(meta)
FROM (
    SELECT 
        pair_id,
        tm at time zone '3' at time zone 'UTC' as tm,
        meta
    FROM tests.tbl
) t
WHERE tm >= '2020-06-07'::date AND tm < '2020-06-09'::date
GROUP BY 1, 2
ORDER BY 2, 1;
© www.soinside.com 2019 - 2024. All rights reserved.