如何根据与先前日期相关的条件按日期找出不同的人数?

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

【讨论】:

以上是关于如何根据与先前日期相关的条件按日期找出不同的人数?的主要内容,如果未能解决你的问题,请参考以下文章

如何查询两个不同日期的 Google Analytics 条件?

根据条件按 ID 组合重叠日期

如何根据入院和出院日期计算入住人数

根据不同条件覆盖 ExtJs 4 中的日期字段格式

ms 根据先前记录的日期访问自动填充日期字段

按日期获取表的所有先前记录 MySQL