【问题标题】:Postgres data with interval of 8 hours间隔为 8 小时的 Postgres 数据
【发布时间】:2021-05-18 16:54:49
【问题描述】:

我有一个包含大量行的表。它具有时间戳(以毫秒为单位)、值和 siteId(外键)之类的列。我想以 8 小时的时间戳间隔从最近三个月的数据中获取数据,并且我想在三个月的时间戳中获取所有 siteId 的数据。每个siteId每5分钟就有一次数据。如果我获取过去三个月的数据,它将以数百万计。所以我想每8小时采集一次数据。有时,也可能存在间隙,因此如果 siteId 在第 8 小时内不存在,它应该获取下一个数据,可能是第 8 小时过去 5 分钟(或过去 10 分钟......)。

很难为此创建查询,之后正常获取和按摩数据需要时间。

我正在使用 postgres、java 和 JPA。如果我可以通过查询或通过一些 JPA 实用程序来减轻 CPU 负担?我想将花费的时间(现在每个查询 9 秒)减少到最少。你们能帮帮我吗?提前致谢

我的表结构:

    | timestamp      | value | siteId |
    |----------------|-------|--------|
    | 1610370000000  | 22    | 123    |
    | 1610370700000  | 21    | 123    | 
    | 1610370028000  | 22    | 123    |
    | 1610369889000  | 23    | 123    |
    | 1610370000000  | 22    | 124    |
    | 1613534400000  | 21    | 124    |
    | 1610369889000  | 22    | 124    |
    | 1610370005000  | 23    | 125    |

因此,每个站点每 5 分钟就有一次数据。我想要最近三个月的数据,每个站点的间隔至少为 8 小时。希望这会有所帮助

【问题讨论】:

  • 请添加一些示例数据、表结构和所需的输出。这将有助于了解您的问题。创建查询并不难。您可以使用online tools 进行演示
  • 至少 8 小时的间隔是什么意思?
  • 以防万一它对你有用。 postgresqltutorial.com/postgresql-rank-function 。不知何故,您需要创建分区并使用该分区中的第一个元素。
  • @GordonLinoff 我拥有的数据间隔为 5 分钟(网站每 5 分钟向我发送一次数据),我想从同一个表中获取数据,每 8 小时读取一次数据.
  • 这些结果会是什么样子?

标签: java sql postgresql spring-data-jpa


【解决方案1】:

假设您希望每个 siteID 以 8 小时的间隔在过去 3 个月中与您的示例相同的数据结构。

试试这个:

select 
distinct on (siteId, "group" ) siteId, value, timestamp_,
ceil((extract(epoch from current_timestamp)*1000-timestamp_)/28800000) "group" 
from test
where to_timestamp(timestamp_/1000) between current_timestamp - interval '3 month' and current_timestamp
order by 1,4,3

DEMO

在这里,我将current_timestamptimestamp_ 字段的差异除以2880000(8*60*60*1000) 以获得group 并使用distinct on 获取组的第一个值。

您可以将 order by 从order by 1,4,3(返回范围的最小时间戳_的值)切换到order by 1,4,3 desc(返回范围的最大时间戳_的值)以检查正确的结果。 我不确定性能。但是应该比 java fetching 更好。

【讨论】:

  • 当我使用 JPA 查询时,大约需要 9 秒并获取近一百万个数据,然后我在 java 中过滤这些数据。整个过程大约需要 10-11 秒。当我使用您的查询时,它本身大约需要 39 秒。无论如何,我确实需要在之后按摩数据。很抱歉,您的解决方案对我没有帮助。非常感谢你
【解决方案2】:

如果您需要所有数据,但遇到传输大量数据的问题,我建议您使用分页方法。 https://www.baeldung.com/jpa-pagination

【讨论】:

    猜你喜欢
    • 2010-10-31
    • 2021-12-26
    • 2022-01-16
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多