如何根据与先前日期相关的条件按日期找出不同的人数?
Posted
技术标签:
【中文标题】如何根据与先前日期相关的条件按日期找出不同的人数?【英文标题】:How to find out distinct count of people by date based on conditions relating to previous dates? 【发布时间】:2018-12-03 14:40:41 【问题描述】:这是 Hackerrank 上的一个问题。基本上,我们必须找出提交的唯一人数,按日期分组。然而问题是,如果比赛在 3 月 1 日开始,那么例如在 3 月 4 日,我们必须只考虑那些在 3 月 1 日、2 日和 3 日实际提交的人。找出它的代码如下:-
SELECT submission_date,
Count(DISTINCT hacker_id) unique_count
FROM (
SELECT d.submission_date,
v.hacker_id,
Count(DISTINCT v.submission_date) cnt
FROM (
SELECT DISTINCT submission_date
FROM submissions
--ORDER BY submission_date
) d,
submissions v
WHERE v.submission_date <= d.submission_date
GROUP BY d.submission_date,
v.hacker_id ) e
WHERE CONVERT(VARCHAR(max),Day(submission_date)) = cnt
GROUP BY submission_date
--ORDER BY submission_date
) table2
表格提交有 4 列:- 提交日期、提交 ID、黑客 ID、分数 如果我们有样本数据:-
3-1-2018, a5, 200, 98
3-1-2018, d6, 400, 96
3-2-2018, e7, 200, 91
3-2-2018, v5, 205, 82
这里,hacker 200 有 2 次提交,hacker 205 和 400 分别提交了 1 次。
对于日期 3-1-2018,我们将计算总数。提交为 2,但 2018 年 3 月 2 日,我们将仅计算 1,因为黑客 205 在前一天没有提交。
我无法理解的部分是使用了 convert varchar max(day, submit date) 的部分。
谁能解释一下这段代码?
谢谢,
【问题讨论】:
您可能希望包含一些示例数据来表达您的观点。 这是您将 cnt(很可能是一个数字)与同样是一个数字的 day 进行比较的地方。 内部查询 e 是提交日期和黑客的列表,以及他们在该日期之前提交的数量。外层查询查询e,只有当黑客提交的次数等于DAY数时才返回一条记录。因此,如果是第 4 次,则黑客必须在该日期之前准确计算 4 次提交。 varchar max 的原因尚不清楚 @Tim Biegeleisen 添加了。 我确定你可以删除 CONVERT,它只是将字符串与数字进行比较,但实际的“事物”始终是数字,Day(submission_date) = cnt 也一样我相信。考虑以下实验 - select 1 where 1 = convert(varchar(max) , 3-2) 【参考方案1】:这里有一个例子供你理解
create table #temp_date_eg
( business_date date null
)
insert into #temp_date_eg values
('2018-11-01')
,('2018-11-10')
,('2018-10-29')
,('2018-11-15')
select top 10 CONVERT(VARCHAR(max),Day(business_date)),business_date
from #temp_date_eg
【讨论】:
以上是关于如何根据与先前日期相关的条件按日期找出不同的人数?的主要内容,如果未能解决你的问题,请参考以下文章