Mysql 来自hackerrank的15天Sql
我无法理解这一行在代码中的用法。有人能解释一下这一点吗?或者给出一些不同的方法来解决这个问题吗 问题的链接: 代码: 无法理解他们为什么使用这部分代码中的这一行:Mysql 来自hackerrank的15天Sql,mysql,sql-server,Mysql,Sql Server,我无法理解这一行在代码中的用法。有人能解释一下这一点吗?或者给出一些不同的方法来解决这个问题吗 问题的链接: 代码: 无法理解他们为什么使用这部分代码中的这一行: (s3.submission_date < s1.submission_date) = dateDIFF(s1.submission_date , '2016-03-01')) 要理解这句话 ( SELECT COUNT(distinct s3.submission_date) FROM
(s3.submission_date < s1.submission_date) = dateDIFF(s1.submission_date , '2016-03-01'))
要理解这句话
( SELECT COUNT(distinct s3.submission_date)
FROM Submissions s3
WHERE
s3.hacker_id = s2.hacker_id
AND s3.submission_date < s1.submission_date)
= dateDIFF(s1.submission_date , '2016-03-01')
首先了解左手边:
此行统计每个黑客id在当前日期之前的唯一提交日期,
因此,如果一行的日期为2016-03-05,则将计算黑客id的唯一提交。在此日期注释中,将一个黑客在一天内提交的多份提交计算为1份
换句话说,这需要一个黑客id,并开始检查从第一天起每天是否有该黑客id的提交。直到今天,它将在每个提交日期执行此操作
然后了解右手边:
日期差异1.提交日期'2016-03-01'
这将取当前日期2016-03-05与第一天2016-03-01的差值
现在理解整个声明:
因此,如果黑客在2016-03-05至2016-03-01期间每天至少提交一份申请,那么上述代码的双方都是平等的,
也就是说,从5号到1号的日期差将是5号右边,对于从1号到5号每天至少提交一次的黑客来说,不同的提交日期也将是5号左边,这不是整行。它是从提交s3中选择COUNTdistinct s3.submission\u date,其中s3.hacker\u id=s2.hacker\u id和s3.submission\u date
CREATE TABLE #max_submissions (
submission_date date,
hacker_id integer,
submission_count integer,
ordering_row integer
)
insert into #max_submissions
select
submission_date,
hacker_id,
submission_count,
row_number() over(partition by submission_date order by submission_count desc, hacker_id) as ordering_row
from (
select submission_date,
hacker_id,
count(hacker_id) as submission_count
from submissions
group by submission_date, hacker_id
) tbl_submission_count
CREATE TABLE #hacker_counts (
submission_date date,
hacker_count integer
)
insert into #hacker_counts
select tbl.submission_date,
COUNT(distinct tbl.hacker_id) as cc
from (
select *,
(case when (
(select count(*)
from (select distinct *
from (select s1.hacker_id,
s1.submission_date
from Submissions s1
where s1.hacker_id = s.hacker_id and
(s1.submission_date >= '2016-03-01' and
s1.submission_date <= s.submission_date)) t1
) t2
) >= (DATEDIFF(day, '2016-03-01', s.submission_date) + 1) )
then 1
else 0
end) as logic
from Submissions s
) tbl
where tbl.logic = 1
group by tbl.submission_date
select max_submissions.submission_date,
hacker_counts.hacker_count,
max_submissions.hacker_id,
h.name
from #max_submissions max_submissions
inner join hackers h on max_submissions.hacker_id = h.hacker_id
left join #hacker_counts hacker_counts on max_submissions.submission_date = hacker_counts.submission_date
where max_submissions.ordering_row = 1
order by max_submissions.submission_date
drop table #max_submissions
drop table #hacker_counts
( SELECT COUNT(distinct s3.submission_date)
FROM Submissions s3
WHERE
s3.hacker_id = s2.hacker_id
AND s3.submission_date < s1.submission_date)
= dateDIFF(s1.submission_date , '2016-03-01')
(SELECT COUNT(distinct s3.submission_date) FROM Submissions s3 WHERE s3.hacker_id = s2.hacker_id AND s3.submission_date < s1.submission_date)