我試圖解決一個挑戰,並提出瞭解決方案。我寫的解決方案適用於小數據集,但對於較大的數據集似乎不起作用。有人能幫助我,我在哪裏做錯了?SQL不適用於大樣本
我在計算每天的獨特用戶(輸出中的第二列)時遇到了麻煩。其餘的邏輯工作正常。
Julia進行了15天的SQL學習競賽。比賽的開始日期爲2016年3月1日,結束日期爲2016年3月15日。
撰寫一個查詢,以打印每天至少提交一次的獨特黑客總數(從第一天開始比賽),並找到每天提交最多提交數的黑客的黑客名稱和黑客名字。如果不止一個這樣的黑客具有最大數量的提交,則打印最低的hacker_id。查詢應該爲比賽的每一天打印此信息,並按日期排序。
輸入格式
下表保存比賽數據:
黑客:該hacker_id是黑客的id和名稱是名黑客的 。
意見書:本submission_date是提交之日起,submission_id是提交的ID,hacker_id是誰提出的劃界案黑客的id和得分的得分提交。
樣品輸入
對於以下示例輸入,假設比賽是06年3月的最後一天,2016年
黑客表:Submis sions表:
**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鏈接創建架構和數據.... – Teja
究竟你的意思是什麼「它似乎並沒有正常工作」? – HoneyBadger
你的sqlfiddle中的「學院」表與你有什麼關係? –