sql - Oracle GROUP BY 类似的时间戳?

标签 sql oracle group-by

我有一个结构如下的事件表:

id  prd_id  act_dt               grp
------------------------------------
1   1       2000-01-01 00:00:00
2   1       2000-01-01 00:00:01
3   1       2000-01-01 00:00:02
4   2       2000-01-01 00:00:00
5   2       2000-01-01 00:00:01
6   2       2000-01-01 01:00:00
7   2       2000-01-01 01:00:01
8   3       2000-01-01 00:00:00
9   3       2000-01-01 00:00:01
10  3       2000-01-01 02:00:00

我想按产品 ( prd_id ) 和事件日期 ( act_dt ) 拆分此事件表中的数据,并使用每个组的序列值更新组 ( grp ) 列。

关键是,我需要按相似的时间戳进行分组,其中相似的意思是“所有记录的差异正好是 1 秒”。换句话说,在一个组内,按日期排序的任何 2 条记录之间的差异将恰好是 1 秒,而第一条和最后一条记录之间的差异可以是任意时间量,只要所有中间记录都是 1 秒分开。

对于示例数据,组将是:
id  prd_id  act_dt               grp
------------------------------------
1   1       2000-01-01 00:00:00  1
2   1       2000-01-01 00:00:01  1
3   1       2000-01-01 00:00:02  1
4   2       2000-01-01 00:00:00  2
5   2       2000-01-01 00:00:01  2
6   2       2000-01-01 01:00:00  3
7   2       2000-01-01 01:00:01  3
8   3       2000-01-01 00:00:00  4
9   3       2000-01-01 00:00:01  4
10  3       2000-01-01 02:00:00  5

我会用什么方法来完成这个?

表的大小约为 2000 万行,如果这会影响用于解决问题的方法。

最佳答案

我不是 Oracle 专家,所以我在猜测一行的最佳选择:

    (CAST('2010-01-01' AS DATETIME) - act_dt) * 24 * 60 * 60      AS time_id,

这只需是“从 [aDateConstant] 到 act_dt 的秒数”。结果可能是否定的。它只需要一个秒数,即可转动您的 act_dt进入一个INT。其余的应该可以正常工作。
WITH
  sequenced_data
AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY prd_id  ORDER BY act_dt)      AS sequence_id,
    (CAST('2010-01-01' AS DATETIME) - act_dt) * 24 * 60 * 60      AS time_id,
    *
  FROM
    yourTable
)
SELECT
  DENSE_RANK() OVER (PARTITION BY prd_id ORDER BY time_id - sequence_id) AS group_id,
  *
FROM
  sequenced_data 

示例数据:
 sequence_id | time_id | t-s | group_id
-------------+---------+-----+----------
      1      |   1     |  0  |    1
      2      |   2     |  0  |    1
      3      |   3     |  0  |    1
      4      |   8     |  4  |    2
      5      |   9     |  4  |    2
      6      |   12    |  6  |    3
      7      |   14    |  7  |    4
      8      |   15    |  7  |    4

注意:这确实假设有 不是 同一时间的多条记录。如果有,则需要先过滤掉它们。可能只是在前面的 CTE 中使用 GROUP BY。

关于sql - Oracle GROUP BY 类似的时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9980117/

相关文章:

MySQL 按月、年计数,如果没有则显示 0

mysql - 根据主键插入或更新

mysql - ./libraries/plugin_interface.lib.php 中的 phpmyadmin 警告错误#551

oracle - AUTONOMOUS_TRANSACTION : pros and cons

SQL 'CASE WHEN x' 与 'CASE x WHEN' 大于条件?

Oracle SYSTPH* 类型

sql - 为什么 SHAPE.SDO_ORDINATES(1) 在 PL/SQL 中有效,但在 SQL 中无效?

group-by - 使用 Hive 查找组中的第一行

sql - 获取每个视频的评论和每个视频 channel 的评论总数

Python Pandas 按连续多列分组