0

我有一个作为 player1 的玩家表,我想在其中获取连续第二天登录的人数。因此,就我而言,输出将是 2,因为连续第二天有 2 人登录。我尝试了以下 select count(*) from ( select player_id from player1 group by player_id 有 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 行

在此处输入图像描述

4

2 回答 2

0

在 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子句(和 in )中的名称define由我们自行决定(我们创建这些名称的方式与为表或查询中的列赋予别名的方式相同)。它们用于对行进行分类 - 可以是“first_date”、“same_day”(作为第一个日期)或“next_day”(在初始登录日期之后)。锚点^意味着匹配将从每个分区中的最早日期开始(这与字符串的正则表达式中的使用完全相同)。

match_recognize学习需要时间(对于尚未了解和使用它的程序员),但非常值得付出努力。

于 2021-09-18T18:04:52.463 回答
0

我能够得到如下答案:

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

有没有更简单的方法来做到这一点?请告诉我。

于 2021-09-18T17:55:09.593 回答