【发布时间】:2022-08-03 22:37:12
【问题描述】:
我一直在尝试解决以下问题 https://www.hackerrank.com/challenges/15-days-of-learning-sql/problem?isFullScreen=true 但看起来似乎卡在查找在给定开始日期之后的每个日期提交的hacker_ids 的计数。以下是2个版本的解决方案max_submissions如果多个最大日期正确,则给出每个日期的最大提交计数,ID 最低,但在最终查询计数中,我无法获得正确的计数,对于每个hacker_id 每天提交的所有日期,计数为 35 .只有第二列是唯一的黑客在输出中计数,我无法得到我得到 35 作为所有或其他值的计数值,这似乎与预期输出不同但逻辑似乎是正确的
with max_submissions
as
(
Select t.submission_date,t.hacker_id,t.cnt,h.name From
(Select * from
(Select submission_date, hacker_id, cnt, dense_rank() over (partition by submission_date order by cnt desc,hacker_id asc) as rn
from
(Select
submission_date, hacker_id, count(submission_id) cnt
from
submissions
where submission_date between \'2016-03-01\' and \'2016-03-15\'
group by submission_date, hacker_id
)
)where rn =1
) t join
hackers h on t.hacker_id=h.hacker_id
),
t1
as
(
select hacker_id
from
(
Select
hacker_id, lead(submission_date) over ( order by hacker_id,submission_date)
-submission_date cnt
from
submissions
where submission_date between \'2016-03-01\' and \'2016-03-15\'
order by hacker_id asc, submission_date asc)
group by hacker_id having sum(case when cnt=1 then 1 else 0 end) =14)
select s.submission_date,count( t1.hacker_id)
from submissions s
join
t1 on
s.hacker_id=t1.hacker_id
group by s.submission_date;
-
请edit您的问题整齐地格式化您的代码并解释您的代码。你为什么使用
LEAD,HAVING子句是干什么用的? -
当然,将在一段时间内编辑格式。我使用 Lead 按日期的顺序减去下一个日期,因此,如果我每次都得到 1,这意味着通过 sum 连续计数为 1,我指向那些遵循相同的 id。