选择相距超过 30 秒的元组

Posted

技术标签:

【中文标题】选择相距超过 30 秒的元组【英文标题】:select tuples with more than 30 seconds from each other 【发布时间】:2021-07-06 22:41:03 【问题描述】:

抱歉我的格式不好,我从来没有使用过这个平台。

我有一个带有一些时间戳的表,我想选择那些彼此相距超过 30 秒并且是连续的。

是这样的:

名为“nova”的表,只有一列为“tempo”。

Tempo
2021-06-04 13:48:46-03
2021-06-04 13:48:50-03
2021-06-04 13:54:06-03
2021-06-04 13:56:30-03
2021-06-04 13:56:31-03
2021-06-04 13:58:57-03
2021-06-04 13:58:59-03
2021-06-04 14:01:30-03
2021-06-04 14:01:35-03
2021-06-04 14:04:08-03
2021-06-04 14:06:45-03

我想选择间隔至少 30 秒的那些。 但每当我说:

"select distinct t1.* from nova t1, nova t2 where t2.tempo-t1.tempo > '00:00:30';"

Postgres 不会过滤任何条目,因为它会相互操作所有元组,并且总有一个组合的差异大于 30 秒。

我需要过滤连续的条目,优先考虑旧的条目,如下:

Tempo
2021-06-04 13:48:46-03
2021-06-04 13:54:06-03
2021-06-04 13:56:30-03
2021-06-04 13:58:57-03
2021-06-04 14:01:30-03
2021-06-04 14:04:08-03
2021-06-04 14:06:45-03

感谢您的帮助!

【问题讨论】:

这有时被称为gaps-and-islands 问题,供您参考 仅关于连续时间戳或仅关于相隔 30 秒的任何其他时间戳?只有年长的,只有年轻的还是两者兼而有之?为清楚起见edit 问题并提供minimal reproducible example,即所涉及的表或其他对象的CREATE 语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及表格文本格式的示例数据的所需结果。并显示您已经明确尝试过的内容——发布代码。解释失败的原因/位置。具体(错误消息、意外结果等)。 我会编辑和澄清。我试图找到间隔不少于 30 秒的连续时间戳。 【参考方案1】:

这个查询解决了这个问题:

with q as (select tempo, lead(tempo) over (order by tempo) from nova)
select tempo from q where lead is null or age(lead, tempo) > '30 seconds';

【讨论】:

成功了!谢谢!

以上是关于选择相距超过 30 秒的元组的主要内容,如果未能解决你的问题,请参考以下文章

使用 AliasableEvalFunc 并在 Java UDF 中读取一组元组

C#中的元组对象Tuple

python3元组

好好学python · 元组

好好学python · 元组

pythonPython中的元组字典——05