Postgresql 如果db中的数据有时区偏移,则按天分组和+配对id
我有一个服务器,它给我一些信息,这些信息按我使用日期分组。由于时区的原因,我知道我数据库中的2020-06-06 21:00:00实际上是2020-06-07 00:00:00。 我需要计算列meta的和,按tm+pair_id分组,但由于来自数据库的偏移量数据(具有2020-06-06 21:00)tm与其他2020-06-07数据不求和。因此,我没有每天的总量+配对id,而是有几行具有相同的tm和配对id,因为结果中2020-06-06 21:00变为2020-06-07 00:00 我可以在不创建子请求的情况下修复此处的分组吗 我有一张桌子:Postgresql 如果db中的数据有时区偏移,则按天分组和+配对id,postgresql,date,group-by,timestamp,timezone,Postgresql,Date,Group By,Timestamp,Timezone,我有一个服务器,它给我一些信息,这些信息按我使用日期分组。由于时区的原因,我知道我数据库中的2020-06-06 21:00:00实际上是2020-06-07 00:00:00。 我需要计算列meta的和,按tm+pair_id分组,但由于来自数据库的偏移量数据(具有2020-06-06 21:00)tm与其他2020-06-07数据不求和。因此,我没有每天的总量+配对id,而是有几行具有相同的tm和配对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
);
有了这些数据:
我的问题是:
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;
我的结果是:
预期结果是:
我认为你想要的逻辑是:
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;
也就是说:select和GROUPBY子句应该特别一致,timestamp列在这两个子句中应该是偏移的
如果将偏移量移动到子查询,可能更容易理解:
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;
第一个查询有错误的结果-总和是9和13,因此它与2020-06-06 21:00的总和不符。第二个有正确的结果,但它是子查询。。。顺便问一下,“1,2分组”是什么意思?这里的1和2是什么?列数?@Mitch:1和2指SELECT子句中的列数。例如,在第二个查询中,1是pair_id,2是date_trunc'day',tm。谢谢,以前从未使用过这个。在您的第一个查询中,在'2020-06-06 21:00:00+00:00:00'和'2020-06-08 21:00:00+00:00:00'之间更改为'tm',并且它似乎可以正常工作。请在此处添加'2020-06-08 21:00+00:00:00'以便于开箱操作