我有以下查询工作正常,但它给了我一整天(00:00到23:59 UTC)的计数。例如,它给了我2017年1月1日(00:00到23:59 UTC)的全部计数。
我的数据集适用于从UTC UTC到12:00 UTC的查询。例如,我正在寻找从2017年1月1日12:00 UTC到2017年1月2日12:00 UTC的所有计数。
这是我的问题:
SELECT count(DISTINCT ltg_data.lat), cwa, to_char(time, 'MM/DD/YYYY')
FROM counties
JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom)
WHERE cwa = 'MFR'
AND time BETWEEN '1987-06-01'
AND '1992-08-1'
GROUP BY cwa, to_char(time, 'MM/DD/YYYY');
仅供参考...我正在改变时间的格式,以便我可以在javascript中更容易地使用结果。
对数据集的描述。它是每秒在各种多边形内发生的数千个点数据。我正在确定点是否与多边形“cwa = MFR”一起发生,然后计算它们。
感谢您的帮助!
答案 0 :(得分:1)
我在这里看到两种方法。
首先,join generate_series(start_date::timestamp,end_date,'12 hours'::interval)
来计算generate_series
。我相信这会更正确。但它有一个主要的减号 - 您必须lateral join
对现有数据集使用min(time)
和max(time)
......
generate_series
的县内容,间隔为2小时作为样本数据):
t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
g)
select count(1),to_char(g,'MM/DD/YYYY') from counties
group by to_char(g,'MM/DD/YYYY')
order by 2;
count | to_char
-------+------------
12 | 09/01/2017
12 | 09/02/2017
12 | 09/03/2017
1 | 09/04/2017
(4 rows)
因此,对于UTC
时区,由于我的样本中generate_series
的包含性,最后几天为1行,因此上述天数有12个两小时的间隔行。一般来说:37行。
现在是一个猴子黑客:
t=# with counties as (select generate_series('2017-09-01'::timestamptz,'2017-09-04'::timestamptz,'2 hours'::interval)
g)
select count(1),to_char(g at time zone 'utc+12','MM/DD/YYYY') from counties
group by to_char(g at time zone 'utc+12','MM/DD/YYYY')
order by 2;
count | to_char
-------+------------
6 | 08/31/2017
12 | 09/01/2017
12 | 09/02/2017
7 | 09/03/2017
(4 rows)
我为不同的时区选择相同的日期,正好将其切换为12小时,从中午8月31日开始的第一天,而不是1月9日午夜,计数更改,仍然共计37行,但是按照您要求的方式分组...
<强>更新强>
对于您的查询,我试试像:
SELECT count(DISTINCT ltg_data.lat), cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY')
FROM counties
JOIN ltg_data on ST_contains(counties.the_geom, ltg_data.ltg_geom)
WHERE cwa = 'MFR'
AND time BETWEEN '1987-06-01'
AND '1992-08-1'
GROUP BY cwa, to_char(time at time zone 'utc+12', 'MM/DD/YYYY');
如果您想将+12小时逻辑应用于where子句,请将at time zone 'utc+12'
添加到&#34;时间&#34;比较