Select 'FAILURE' 来自 table 的 payment_id 状态记录,在 5 分钟内没有任何 'SUCCESS' 状态更新
Select 'FAILURE' status records from the table for payment_id which do not have any 'SUCCESS' status updated within 5 minutes
我有一个包含以下字段的 table
payment_id
、purchase_id
、status
、created_at
、updated_at
一个payment_id可以有多个记录。 (一个payment_id可以有多个purchase_id)
对于每个 payment_id 我需要找到所有状态为 'FAILURE' 并且没有任何记录具有与 'SUCCESS' 相同的 payment_id 更新的记录最后 5 分钟。
我在加入相同 table 后尝试在 payment_id 分组,但我无法获得所需的结果。请帮忙
如果我没看错的话,你可以使用not exists
:
select t.*
from mytable t
where t.status = 'FAILURE' and not exists (
select 1
from mytable t1
where
t1.payment_id = t.payment_id
and t1.status = 'SUCCESS'
and t1.updated_at >= t.updated_at - interval 5 minute
and t1.updated_at < t.updated_at
)
这会带来“失败”记录,而在之前的 5 分钟内不存在相同 payment_id
的“成功”记录,并且 updated_at
。
您可以为此使用 window 函数。一种方法是:
select t.*
from (select t.*,
sum(status = 'SUCCESS') over (
partition by payment_id
order by updated_at
range between 5 minute preceding and current row
) as cnt_success_5
from t
) t
where status = 'FAILURE' and
cnt_success_5 = 0;
我有一个包含以下字段的 table
payment_id
、purchase_id
、status
、created_at
、updated_at
一个payment_id可以有多个记录。 (一个payment_id可以有多个purchase_id)
对于每个 payment_id 我需要找到所有状态为 'FAILURE' 并且没有任何记录具有与 'SUCCESS' 相同的 payment_id 更新的记录最后 5 分钟。
我在加入相同 table 后尝试在 payment_id 分组,但我无法获得所需的结果。请帮忙
如果我没看错的话,你可以使用not exists
:
select t.*
from mytable t
where t.status = 'FAILURE' and not exists (
select 1
from mytable t1
where
t1.payment_id = t.payment_id
and t1.status = 'SUCCESS'
and t1.updated_at >= t.updated_at - interval 5 minute
and t1.updated_at < t.updated_at
)
这会带来“失败”记录,而在之前的 5 分钟内不存在相同 payment_id
的“成功”记录,并且 updated_at
。
您可以为此使用 window 函数。一种方法是:
select t.*
from (select t.*,
sum(status = 'SUCCESS') over (
partition by payment_id
order by updated_at
range between 5 minute preceding and current row
) as cnt_success_5
from t
) t
where status = 'FAILURE' and
cnt_success_5 = 0;