PostgreSQL:计算每小时和位置的元素

时间:2014-11-13 19:01:29

标签: sql postgresql aggregate-functions

我有一个像这样的结构的PostgreSQL表

id    elementid    timestamp                providerid    x    y
1     1            2014-10-01T00:00:00Z     12           12   18
2     1            2014-10-01T00:10:00Z     12           14   18
3     1            2014-10-01T00:15:00Z     12           16   20
4     2            2014-10-01T00:50:00Z     12           12   18
5     2            2014-10-01T01:10:00Z     12           14   18
6     2            2014-10-01T01:15:00Z     12           16   20
7     7            2014-10-01T00:00:00Z     14           12   18
8     7            2014-10-01T00:10:00Z     14           14   18
9     7            2014-10-01T00:15:00Z     14           16   20

我想计算每小时和位置属于同一elementid的不同providerid的数量。

一个例子

00:00和01:00 之间,在 xmin = 12,ymin = 18,xmax = 16,ymax = 20 定义的框中,有< strong> 2个元素属于 providerid 12 (4个第一个记录:元素与elementid = 1,元素与elementid = 2)。因此,对于providerid = 12 ,计数每小时 2个元素。

正如您所看到的,我真的在处理移动元素。因此,在该时间范围内(1小时),我将元素1放在3个不同的位置,元素2放在一个位置。因此,共有2个元素,属于同一个提供者(providerid = 12)。

然后,我的结果集应如下所示:

providerid              start_time                end_time    num_elements
        12    2014-10-01T00:00:00Z    2014-10-01T01:00:00Z               2

我希望每个提供商的相同

我猜这个回复类似于this onethis onethis one,但仍然没有找到解决方案。任何帮助都非常感谢。

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您是否尝试过COUNT( DISTINCT ... )

SELECT t1."providerid",
       s.start_time,
       s.end_time,
       COUNT( DISTINCT "elementid" ) As num_elements
FROM table1 t1
JOIN start_end_time s
ON t1."timestamp" BETWEEN s.start_time AND s.end_time
GROUP BY 
       t1."providerid",
       s.start_time,
       s.end_time

演示:http://sqlfiddle.com/#!12/b55a8/2