【问题标题】:SQL difference between two timestamp and categorizing to 1 minute bucket两个时间戳和分类到 1 分钟桶之间的 SQL 差异
【发布时间】:2020-10-23 15:04:40
【问题描述】:

我正在处理一个示例项目,其中我使用了一个名为 TDV(TIBCO 数据虚拟化)的工具,它支持 oracle 和 Postgres SQL。我有两个带有一些值的时间戳列 startDate 和 endDate,我试图将数据扩展到 1 分钟,但我无法以所需的格式获取它。 startdate 和 enddate 之间的差异不是恒定的,有时是 3 分钟或 5 或 7 分钟。我做了一些研究,找不到合适的解决方案。

样本数据

+--------------------+--------------------+--------+
|     StartDate      |      EndDate       | Val1   |
+--------------------+--------------------+--------+
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 |     10 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 |     22 |
+--------------------+--------------------+--------+

期望的结果

+--------------------+--------------------+--------------------+--------+
|     StartDate      |      EndDate       |     Time_1Min      | Val1   |
+--------------------+--------------------+--------------------+--------+
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 | 3/22/2020 10:07:00 |     10 |
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 | 3/22/2020 10:08:00 |     10 |
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 | 3/22/2020 10:09:00 |     10 |
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 | 3/22/2020 10:10:00 |     10 |
| 3/22/2020 10:06:30 | 3/22/2020 10:11:29 | 3/22/2020 10:11:00 |     10 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 | 3/22/2020 14:21:00 |     22 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 | 3/22/2020 14:22:00 |     22 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 | 3/22/2020 14:23:00 |     22 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 | 3/22/2020 14:24:00 |     22 |
| 3/22/2020 14:20:51 | 3/22/2020 14:25:50 | 3/22/2020 14:25:00 |     22 |
+--------------------+--------------------+--------------------+--------+

【问题讨论】:

  • 我建议您使用一个数据库进行标记。数据位于某处
  • @GordonLinoff 好的,肯定会更新,你的意思是删除标签对吗?谢谢
  • @Nik 在以后的帖子中请不要张贴图片see why 使用格式化文本。格式化文本的好方法see here。复制并粘贴结果并将它们包含在包含 ``` 的行中。
  • @Belayer 当然,请记住不要发布图像,关于工具,它的 TDV(TIBCO 数据虚拟化)我将在问题中更新相同内容以供将来参考。
  • 为什么新列的日期会变?

标签: sql oracle


【解决方案1】:

您可以使用递归 CTE:

with recursive cte as (startdate, enddate, time_1min, value) as
      select startdate, enddate, trunc(startdate) + interval '1 minute', value
      from t
      union all
      select startdate, enddate, time_1min + interval '1 minute', value
      from cte
      where time_1min < enddate
     )
select *
from cte;

【讨论】:

  • 感谢您的回复,我尝试了您的建议,不得不稍微更改语法。我看到 time_1min 只有日期没有时间,而且它正在进行交叉连接。例如,在想要的结果中,我必须看到 5 行,但我看到超过 500 行
  • @Nik 。 . .你能设置一个 db fiddle 吗?
  • 第一次创建 DB Fiddle,here 让我知道这是否可行
【解决方案2】:

您说您正在使用支持 Oracle 和 Postgres 的工具,但您确实让我们知道该工具是什么。我们可以建议的工具不多。所以我提供了一个基于 generate_series 而不是递归 CTE 的 Postgres solution

select startdate, enddate, time_1min, value 
  from t 
 cross join generate_series(date_trunc('minute',startdate)+interval '1 minute)'
                           ,date_trunc('minute',enddate)
                           , interval '1 minute'
                           ) gs(time_1min)
 order by startdate, time_1min;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多