繁体   English   中英

获取按ID分组的每个最新记录的值

[英]Get value of each latest record grouped by ID

我有一个数据记录表,随着时间的推移存储,看起来像这样:

|| ID || timestamp || position || value || field1 || field2 ||

另一张表示地理点的表大致如下:

|| ID || position || field1 || field2 ||

其中每个表的field1和field2属于同一类别(这使我能够比较它们)

我有一个查询,它给我最近的点(从点表)到每条记录,看起来像这样:

SELECT B.ID, A.timestamp as date, A.value, A.field1, A.field2
FROM (SELECT DISTINCT ON (ID) * FROM records) AS A
CROSS JOIN LATERAL (SELECT *
                    FROM points
                    ORDER BY A.position <-> geom
                    LIMIT 1) AS B
WHERE A.field1 = B.field1
AND A.field2 = B.field2

这让我可以准确地知道记录的价值来自何处。

我需要获得每个点的最新值,我开始这样:

SELECT B.ID, MAX(A.timestamp) as date, A.field1, A.field2
FROM (SELECT DISTINCT ON (ID) * FROM records) AS A
CROSS JOIN LATERAL (SELECT *
                    FROM points
                    ORDER BY A.position <-> geom
                    LIMIT 1) AS B
WHERE A.field1 = B.field1
AND A.field2 = B.field2
GROUP BY B.ID, A.field1, A.field2

但是我不知道如何从我的结果集中的数据记录中获取值,现在如果我只是将它添加到顶部,它会要求我将它添加到GROUP BY子句中。

我已经阅读了其他答案,我需要使用INNER JOIN或LATERAL JOIN,但在这种情况下,它会搜索每一个记录的最近点一秒钟,这会大大减慢请求。 有没有办法避免两次执行请求,然后使用field1和field2匹配它们?

编辑:

这是数据记录的样子(位置非常长且不相关所以我决定不显示它们)

ID  |      timestamp      |   position   | value |   field1   |  field2
----|---------------------|--------------|-------|------------|-----------
001 | 2019-05-03 17:50:00 |    {....}    |   5   |   South    |  Forward
----|---------------------|--------------|-------|------------|-----------
002 | 2019-05-03 17:55:00 |    {....}    |  17   |   South    |  Forward
----|---------------------|--------------|-------|------------|-----------
003 | 2019-05-03 18:30:00 |    {....}    |   0   |   South    |  Backward
----|---------------------|--------------|-------|------------|-----------
004 | 2019-05-03 13:20:00 |    {....}    |  25   |    West    |  Forward
----|---------------------|--------------|-------|------------|-----------
005 | 2019-05-03 14:30:00 |    {....}    |  36   |    West    |  Backward
----|---------------------|--------------|-------|------------|-----------
006 | 2019-05-03 16:00:00 |    {....}    |  12   |    West    |  Backward

运行我的第一个查询(以获得最近的点)后,我得到这个:

 B.ID |      timestamp      | value |   field1   |  field2
------|---------------------|-------|------------|-----------
 475  | 2019-05-03 17:50:00 |   5   |   South    |  Forward
------|---------------------|-------|------------|-----------
 263  | 2019-05-03 17:55:00 |  17   |   South    |  Forward
------|---------------------|-------|------------|-----------
 157  | 2019-05-03 18:30:00 |   0   |   South    |  Backward
------|---------------------|-------|------------|-----------
 957  | 2019-05-03 13:20:00 |  25   |    West    |  Forward
------|---------------------|-------|------------|-----------
 547  | 2019-05-03 14:30:00 |  36   |    West    |  Backward
------|---------------------|-------|------------|-----------
 547  | 2019-05-03 16:00:00 |  12   |    West    |  Backward

其中B.ID对应于与记录位置的最近点。

在运行查询以获取每个[ID / field1 / field2]组合的最新记录时,我得到的是:

 B.ID |      timestamp      |   field1   |  field2
------|---------------------|------------|-----------
 475  | 2019-05-03 17:50:00 |   South    |  Forward
------|---------------------|------------|-----------
 263  | 2019-05-03 17:55:00 |   South    |  Forward
------|---------------------|------------|-----------
 157  | 2019-05-03 18:30:00 |   South    |  Backward
------|---------------------|------------|-----------
 957  | 2019-05-03 13:20:00 |    West    |  Forward
------|---------------------|------------|-----------
 547  | 2019-05-03 16:00:00 |    West    |  Backward

你可以看到只有前一行消失了,因为它与最后一行(ID / field1 / field2)具有相同的组合,而且它更旧。

而我喜欢的是:

 B.ID |      timestamp      | value |   field1   |  field2
------|---------------------|-------|------------|-----------
 475  | 2019-05-03 17:50:00 |   5   |   South    |  Forward
------|---------------------|-------|------------|-----------
 263  | 2019-05-03 17:55:00 |  17   |   South    |  Forward
------|---------------------|-------|------------|-----------
 157  | 2019-05-03 18:30:00 |   0   |   South    |  Backward
------|---------------------|-------|------------|-----------
 957  | 2019-05-03 13:20:00 |  25   |    West    |  Forward
------|---------------------|-------|------------|-----------
 547  | 2019-05-03 16:00:00 |  12   |    West    |  Backward

你想再次distinct on吗?

SELECT DISTINCT ON (p.ID) p.ID, r.*
FROM (SELECT DISTINCT ON (r.ID) r.* FROM records r
     ) r CROSS JOIN LATERAL
     (SELECT p.*
      FROM points p
      ORDER BY r.position <-> p.geom
      LIMIT 1
     ) p
WHERE r.field1 = p.field1 AND r.field2 = p.field2
ORDER BY p.ID, r.timestamp DESC;

我无法弄清楚你的意图:

(SELECT DISTINCT ON (ID) *
 FROM records
)

至少,你应该有一个ORDER BY

(SELECT DISTINCT ON (ID) *
 FROM records
 ORDER BY ID
)

但是,您的样本数据和名称ID表明没有重复项,因此可能不需要DISTINCT ON

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM