查找唯一标识符重复的每个字段的最大序列号
Posted
技术标签:
【中文标题】查找唯一标识符重复的每个字段的最大序列号【英文标题】:Find each field's max sequence number where unique identifier repeats 【发布时间】:2020-11-20 20:10:50 【问题描述】:我有一个用户、ID 和活动时间戳的列表。数据按用户、ID、活动时间和基于所有这些维度分配的序列号排序。我需要根据序列号提取最早的时间戳,然后按每个用户和 ID 的序列号提取最新的时间戳。问题是当 ID 在当天晚些时候甚至第二天重复时,我的代码没有为每个 ID 拾取唯一的事件序列。
因此,如果用户 A 在 ID A123 上执行 5 个事件,然后在 ID A567 上移动以执行 6 个事件,然后返回 A123 以执行 4 个额外任务,我需要结果来反映 ID A123 上的第一个和最后一个活动,然后是 A567,然后是 A123。
下面是我用来生成表格的当前代码:
SELECT
user_id,
activity_date,
foc_id,
ROW_NUMBER() OVER ( PARTITION BY user_id, mno ORDER BY activity_date ) AS seq_num
FROM cf.activity_history
MATCH_RECOGNIZE (
PARTITION BY user_id
ORDER BY activity_date
MEASURES
MATCH_NUMBER() AS mno
ALL ROWS PER MATCH
PATTERN (same_foc_id * last_row )
DEFINE
same_foc_id AS FIRST(foc_id) = NEXT(foc_id )
)
where
user_id in ('UVAC3','UVAH161','UVEK29','UVRB152')
and (activity_date < (sysdate - 11)
and activity_date > (sysdate - 13))
order by
user_id,
activity_date,
foc_id
enter image description here
【问题讨论】:
请在帖子中而不是在图片中以文本格式分享示例数据。 【参考方案1】:这读起来像是一个间隙和孤岛问题:一个孤岛代表一系列“相邻”行,用户在其中执行相同的活动,而您需要每个孤岛的开始和结束。
一个选项使用lead()
和lag()
。假设foc_id
标识活动:
select user_id, activity_date, foc_id
from (
select a.*,
lead(foc_id) over(partition by user_id order by activity_date) lead_foc_id,
lag(foc_id) over(partition by user_id order by activity_date) lag_foc_id
from cf.activity_history a
where
user_id in ('UVAC3', 'UVAH161', 'UVEK29', 'UVRB152')
and activity_date < sysdate - 11
and activity_date > sysdate - 13
) a
where
lead_foc_id is null
or lag_foc_id is null
or foc_id <> lead_foc_id
or foc_id <> lag_foc_id
【讨论】:
这让我非常接近......但是我不需要为领先和滞后值设置两行单独的行,而是每个 FOC_ID 需要两列,一列用于领先(及时),一列用于滞后(时差)。此外,我需要使用这些时间进行两次计算:进出时间之间的时间,然后是出和下一个时间。 我遇到的另一个问题是,当 FOC_ID 只有一个活动时间戳时......此时,“滞后”(出)时间应该与前(入)时间相同。以上是关于查找唯一标识符重复的每个字段的最大序列号的主要内容,如果未能解决你的问题,请参考以下文章
对已经存在的没有唯一标识的表添加一个自增的id字段(利用序列sequence)操作过程