我有一個 Oracle SQL 表中有超過 200 萬行的資料集,我想對此進行一些關聯分析。要將序列挖掘演算法應用于此資料,我需要一個名為“sequenceId”的列和一個名為“eventId”的列。
表結構如下所示:
- 時間戳
- product_id
- 用戶身份
現在我需要一個 id 每次 user_id 更改時都會增加。如何在 Oracle SQL 中做到這一點?我在 R 中嘗試過,但在那里需要超過 12 個小時......
樣本資料:
| 時間戳 | product_id | 用戶身份 |
|---|---|---|
| 2019-10-01 12:12:24 UTC | 3806 | 535447446 |
| 2019-10-01 19:51:55 UTC | 3762 | 535447446 |
| 2019-10-02 18:09:34 UTC | 3806 | 552286734 |
| 2019-10-02 17:54:01 UTC | 3928 | 493964166 |
預期結果:
| 時間戳 | product_id | 用戶身份 | 序列號 |
|---|---|---|---|
| 2019-10-01 12:12:24 UTC | 3806 | 535447446 | 1 |
| 2019-10-01 19:51:55 UTC | 3762 | 535447446 | 1 |
| 2019-10-02 18:09:34 UTC | 3806 | 552286734 | 2 |
| 2019-10-02 17:54:01 UTC | 3928 | 493964166 | 3 |
當 user_id 改變時,id 應該增加
uj5u.com熱心網友回復:
WITH
source_data AS (
SELECT '2019-10-01 12:12:24' AS timestamp, 3806 AS product_id, 535447446 AS user_id FROM DUAL UNION ALL
SELECT '2019-10-01 19:51:55', 3762, 535447446 FROM DUAL UNION ALL
SELECT '2019-10-02 18:09:34', 3806, 552286734 FROM DUAL UNION ALL
SELECT '2019-10-02 17:54:01', 3928, 493964166 FROM DUAL
),
cte AS (
SELECT timestamp,
product_id,
user_id,
CASE WHEN user_id = LAG(user_id) OVER (ORDER BY timestamp)
THEN 0
ELSE 1
END new_user
FROM source_data
)
SELECT timestamp,
product_id,
user_id,
SUM(new_user) OVER (ORDER BY timestamp) sequence_id
FROM cte;
時間戳 PRODUCT_ID 用戶身份 SEQUENCE_ID 2019-10-01 12:12:24 3806 535447446 1 2019-10-01 19:51:55 3762 535447446 1 2019-10-02 17:54:01 3928 493964166 2 2019-10-02 18:09:34 3806 552286734 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424998.html
標籤:sql 甲骨文 oracle-sqldeveloper
