【问题标题】:Generating ID from starting event从开始事件生成 ID
【发布时间】:2017-03-02 12:22:33
【问题描述】:

我有一个包含客户 ID 和事件类型的表。每次我有 EVENT1 时,我都想增加一个计数器,但是如果事件是 EVENT2 或 EVENT3,那么计数器应该继承以前的值。最终这会给我一个唯一的标识符,基于 EVENT1,它是开始的动作。

这在 Excel 中很容易,但我正在努力创建可以复制它的 SQL。

提前致谢!

表格数据:

Customer ID | Event
001         | EVENT1
001         | EVENT1
001         | EVENT1
001         | EVENT2
001         | EVENT3
001         | EVENT1
001         | EVENT1
001         | EVENT2 

期望的输出:

Customer ID | Event  | UniqueID
001         | EVENT1 | 1
001         | EVENT1 | 2
001         | EVENT1 | 3
001         | EVENT2 | 3
001         | EVENT3 | 3
001         | EVENT1 | 4
001         | EVENT1 | 5
001         | EVENT2 | 5

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您对 SQL 表有误解,因为您假设您的行是按某种顺序排列的。 SQL 表表示 无序 集,除非列明确提供了排序。

    假设您有这样的列,例如id 或日期/时间列。你可以使用解析函数做你想做的事:

    select t.*,
           sum(case when event = 'EVENT1' then 1 else 0 end) over
               (partition by customer_id order by id) as event1Id
    from t;
    

    另请注意,当某些东西显然不是唯一的时,我不愿意将其称为“UniqueId”。

    【讨论】:

    • 谢谢。正如你所说,桌子是有序的,我省略了试图让问题保持简单,这显然适得其反!
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多