【发布时间】:2017-03-17 14:44:51
【问题描述】:
我正在尝试解决一个挑战并想出了解决方案。我编写的解决方案适用于小型数据集,但似乎不适用于较大的数据集。有人可以帮我看看我哪里做错了吗?
我在计算每天的唯一身份用户时遇到了麻烦(输出中的第二列)。其余的逻辑工作正常。
Julia 举办了为期 15 天的 SQL 学习竞赛。比赛开始日期为 2016 年 3 月 1 日,结束日期为 2016 年 3 月 15 日。
编写查询以打印每天至少提交的唯一黑客总数(从比赛的第一天开始),并找到每天提交最大数量的黑客的hacker_id 和名称。如果不止一个这样的黑客有提交的最大数量,打印最低的hacker_id。查询应打印比赛每一天的此信息,按日期排序。
输入格式
下表包含比赛数据:
Hackers:hacker_id是黑客的id,name是名字 黑客。
Submissions:submission_date 是提交日期,submission_id 是提交的id,hacker_id 是提交的黑客的id,score 是提交的分数。
示例输入
对于以下示例输入,假设比赛的结束日期是 2016 年 3 月 6 日。
黑客表:提交表:
**Explanation :-**
2016 年 3 月 1 日,黑客 , , , 并提交了内容。有独特的黑客每天至少提交一次。由于每个黑客都提交了一次,被认为是当天提交的最大数量的黑客。黑客的名字是安吉拉。
2016 年 3 月 2 日,黑客 , , 并提交了意见书。现在并且是唯一每天提交的人,因此有独特的黑客每天至少提交一份。提交了,黑客的名字是迈克尔。
2016 年 3 月 3 日,黑客 , , 并提交了意见书。现在并且是唯一的,所以有独特的黑客每天至少提交一次。由于每个黑客都提交了一次,因此被认为是当天提交最多数量的黑客。黑客的名字是安吉拉。
在 2016 年 3 月 4 日,黑客 , , , 提交了文件。现在并且每天只提交一次,所以每天都有独特的黑客至少提交一次。由于每个黑客都提交了一次,因此被认为是当天提交最多数量的黑客。黑客的名字是安吉拉。
2016 年 3 月 5 日,黑客 , , 并提交了意见书。现在每天只提交一次,所以只有每天至少提交一次的唯一黑客。提交的文件和黑客的名字是弗兰克。
2016 年 3 月 6 日仅提交,因此只有每天至少提交一次的唯一黑客。提交了,黑客的名字是安吉拉。
样本输出
2016-03-01 4 20703 Angela
2016-03-02 2 79722 Michael
2016-03-03 2 20703 Angela
2016-03-04 2 20703 Angela
2016-03-05 1 36396 Frank
2016-03-06 1 20703 Angela
Schema & Data :-
http://sqlfiddle.com/#!9/844928
Solution :-
SELECT A.submission_date, A.cnt, B.hacker_id, B.name
FROM
(
SELECT submission_date, COUNT( DISTINCT hacker_id ) AS cnt
FROM submissions
WHERE submission_date = '2016-03-01'
GROUP BY submission_date
UNION ALL
SELECT submission_date, COUNT( DISTINCT hacker_id )
FROM
(
SELECT DATEADD(day, 1, convert( date, A.submission_date )) AS submission_date, A.hacker_id
FROM
(
SELECT submission_date, hacker_id
FROM submissions
GROUP BY submission_date, hacker_id
) A
INNER JOIN
(
SELECT DATEADD(day, -1, convert( date, submission_date )) AS new_submission_date, hacker_id
FROM submissions
GROUP BY DATEADD(day, -1, convert( date, submission_date )) , hacker_id
) B
ON A.submission_date = B.new_submission_date
AND A.hacker_id = B.hacker_id
) Z
GROUP BY submission_date
) A
INNER JOIN
(
SELECT s.submission_date, s.hacker_id, h.name
FROM
(
SELECT submission_date, hacker_id
FROM
(
SELECT submission_date, hacker_id,cnt, ROW_NUMBER() OVER ( PARTITION BY submission_date ORDER BY cnt DESC, hacker_id ) AS rn
FROM
(
SELECT submission_date, hacker_id, COUNT(*) AS cnt
FROM submissions
GROUP BY submission_date, hacker_id
) Z
) Y
WHERE rn = 1
) s
INNER JOIN
hackers h
ON s.hacker_id = h.hacker_id
) B
ON A.submission_date = B.submission_date
;
【问题讨论】:
-
我添加了 sqlfiddle 链接来创建模式和数据....
-
“它似乎无法正常工作”到底是什么意思?
-
你的 sqlfiddle 中的
colleges表有什么关系? -
这对我来说看起来很像家庭作业。因此,我们可以为您指明正确的方向,但您应该自己做。或者,如果您说这是一个挑战,如果其他人必须为您编写,您如何提交条目?
-
@Carra 执行计划将如何帮助调试逻辑错误?
标签: sql sql-server tsql