oracle通过登录日期获取玩家计数

q0qdq0h2  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(98)

我有一个玩家表作为player1,在那里我想得到的人谁登录在连续第二天的计数。因此,对于我的情况,输出将是2,因为2人连续第二天登录。我尝试了以下方法

select count(*) from (
select player_id from player1 
group by player_id 
having count(player_id)>1
order by player_id
) a
join player1 b
on a.player_id=b.player_id
and b.log_in_date in (b.log_in_date,(b.log_in_date+1))

但这是得到所有的行那就是9行

368yc8dk

368yc8dk1#

在Oracle 12和更高版本中,您可以使用match_recognize轻松完成此操作:

select count(*)
from   player1
match_recognize(
  partition by player_id
  order     by log_in_date
  pattern   (^ first_date same_day* next_day)
  define    next_day as log_in_date = first_date.log_in_date + 1
);

pattern子句(和define)中的名称由我们决定(我们创建这些名称的方式与为查询中的表或列给予别名的方式相同)。它们用于将行分类为“first_date”、“same_day”(作为第一个日期)或“next_day”(在初始登录日期之后)。锚^意味着匹配将在每个分区中的最早日期开始(这与字符串的正则表达式中的用法完全相同)。
match_recognize需要时间来学习(对于那些还不了解和使用它的程序员来说),但它非常值得付出努力。

kxe2p93d

kxe2p93d2#

我得到的答案如下:

select count(distinct dt) from (
  select player_id, min(log_in_date) + 1 dt
  from player1
  group by player_id 
  having count(player_id) > 1
) A join player1
on player1.player_id = a.player_id
where player1.log_in_date = dt

有没有更简单的方法?请告诉我。

相关问题