SQL 自我加入 - 快把我逼疯了
SQL SELF JOIN - driving me crazy
有人可以告诉我如何解决这个问题吗?还有思考过程——比如你在解决这个问题时是怎么想的。这让我发疯。 :(
问题 - 出勤率 table 记录每天举行活动时人群中的人数。向 return a table 写入一个查询,显示访问量高的时期的日期和访问者数量,定义为访问者超过 100 的连续三个条目(不一定是连续的日期)。
oracle上的问题代码-
create table attendance (event_date date, visitors int);
insert into attendance values (to_date('01-01-20', 'mm-dd-yy'), 10);
insert into attendance values (to_date('01-04-20', 'mm-dd-yy'), 109);
insert into attendance values (to_date('01-05-20', 'mm-dd-yy'), 150);
insert into attendance values (to_date('01-06-20', 'mm-dd-yy'), 99);
insert into attendance values (to_date('01-07-20', 'mm-dd-yy'), 145);
insert into attendance values (to_date('01-08-20', 'mm-dd-yy'), 1455);
insert into attendance values (to_date('01-11-20', 'mm-dd-yy'), 199);
insert into attendance values (to_date('01-12-20', 'mm-dd-yy'), 188);
问题TABLE和期望的输出
有几种方法可以解决这个问题,但我没有想到自连接。
最普遍的做法是使用间隙和孤岛方法。但是,我将建议一种更蛮力的方法。只需使用 lead()
和 lag()
即可从上一行和下一行获取值。然后用一个where
子句,看看有没有连续三个满足你的条件:
select a.*
from (select a.*,
lag(visitors, 2) over (order by event_date) as prev2_visitors,
lag(visitors) over (order by event_date) as prev_visitors,
lead(visitors, 2) over (order by event_date) as next2_visitors,
lead(visitors) over (order by event_date) as next_visitors
from attendance a
) a
where least(a.visitors, a.prev_visitors, a.prev2_visitors) > 100 or
least(a.next_visitors, a.visitors, a.prev_visitors) > 100 or
least(a.next2_visitors, a.next_visitors, a.visitors) > 100 ;
Here 是一个 db<>fiddle.
有人可以告诉我如何解决这个问题吗?还有思考过程——比如你在解决这个问题时是怎么想的。这让我发疯。 :(
问题 - 出勤率 table 记录每天举行活动时人群中的人数。向 return a table 写入一个查询,显示访问量高的时期的日期和访问者数量,定义为访问者超过 100 的连续三个条目(不一定是连续的日期)。
oracle上的问题代码-
create table attendance (event_date date, visitors int);
insert into attendance values (to_date('01-01-20', 'mm-dd-yy'), 10);
insert into attendance values (to_date('01-04-20', 'mm-dd-yy'), 109);
insert into attendance values (to_date('01-05-20', 'mm-dd-yy'), 150);
insert into attendance values (to_date('01-06-20', 'mm-dd-yy'), 99);
insert into attendance values (to_date('01-07-20', 'mm-dd-yy'), 145);
insert into attendance values (to_date('01-08-20', 'mm-dd-yy'), 1455);
insert into attendance values (to_date('01-11-20', 'mm-dd-yy'), 199);
insert into attendance values (to_date('01-12-20', 'mm-dd-yy'), 188);
问题TABLE和期望的输出
有几种方法可以解决这个问题,但我没有想到自连接。
最普遍的做法是使用间隙和孤岛方法。但是,我将建议一种更蛮力的方法。只需使用 lead()
和 lag()
即可从上一行和下一行获取值。然后用一个where
子句,看看有没有连续三个满足你的条件:
select a.*
from (select a.*,
lag(visitors, 2) over (order by event_date) as prev2_visitors,
lag(visitors) over (order by event_date) as prev_visitors,
lead(visitors, 2) over (order by event_date) as next2_visitors,
lead(visitors) over (order by event_date) as next_visitors
from attendance a
) a
where least(a.visitors, a.prev_visitors, a.prev2_visitors) > 100 or
least(a.next_visitors, a.visitors, a.prev_visitors) > 100 or
least(a.next2_visitors, a.next_visitors, a.visitors) > 100 ;
Here 是一个 db<>fiddle.