gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:47:05 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com