2017-03-17 67 views
1

我試圖解決一個挑戰,並提出瞭解決方案。我寫的解決方案適用於小數據集,但對於較大的數據集似乎不起作用。有人能幫助我,我在哪裏做錯了?SQL不適用於大樣本

我在計算每天的獨特用戶(輸出中的第二列)時遇到了麻煩。其餘的邏輯工作正常。

Julia進行了15天的SQL學習競賽。比賽的開始日期爲2016年3月1日,結束日期爲2016年3月15日。

撰寫一個查詢,以打印每天至少提交一次的獨特黑客總數(從第一天開始比賽),並找到每天提交最多提交數的黑客的黑客名稱和黑客名字。如果不止一個這樣的黑客具有最大數量的提交,則打印最低的hacker_id。查詢應該爲比賽的每一天打印此信息,並按日期排序。

輸入格式

下表保存比賽數據:

黑客:該hacker_id是黑客的id和名稱是名黑客的 。

enter image description here

意見書:本submission_date是提交之日起,submission_id是提交的ID,hacker_id是誰提出的劃界案黑客的id和得分的得分提交。

enter image description here

樣品輸入

enter image description here

enter image description here

對於以下示例輸入,假設比賽是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 
; 
+0

我加sqlfiddle鏈接創建架構和數據.... – Teja

+0

究竟你的意思是什麼「它似乎並沒有正常工作」? – HoneyBadger

+0

你的sqlfiddle中的「學院」表與你有什麼關係? –

回答

0
IF OBJECT_ID('tempdb..#Results') IS NOT NULL 
    DROP TABLE #Results; 
CREATE TABLE #Results 
([Number of Hackers that had a Submission]     INT, 
SubmissionDate           DATE, 
[Greatest # of Submissions by Hacker (lowest ID if tied)] INT, 
[Hacker Name with Most Submissions]      VARCHAR(50) 
); 
DECLARE @CurrentDate DATE; 
DECLARE my CURSOR 
FOR SELECT DISTINCT 
      submission_date 
    FROM submissions; 
OPEN my; 
FETCH NEXT FROM my INTO @CurrentDate; 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     INSERT INTO #Results 
       SELECT a.hackers [Number of Hackers that had a Submission], 
         a.SubmissionDate, 
         b.Submission_Count [Greatest # of Submissions by Hacker (lowest ID if tied)], 
         b.Hacker [Hacker Name with Most Submissions] 
       FROM 
       (
        SELECT COUNT(DISTINCT hacker_ID) hackers, 
          @CurrentDate [SubmissionDate] 
        FROM submissions 
        WHERE submission_date = @CurrentDate 
       ) a 
       JOIN 
       (
        SELECT TOP 1 COUNT(submission_id) Submission_Count, 
           b.name [Hacker], 
           submission_date 
        FROM submissions a 
         JOIN hackers b ON a.hacker_id = b.hacker_id 
        WHERE a.submission_date = @currentDate 
        GROUP BY b.name, 
          a.hacker_id, 
          submission_date 
        ORDER BY COUNT(submission_id) DESC, 
          a.hacker_id 
       ) b ON a.SubmissionDate = b.submission_date; 
     FETCH NEXT FROM my INTO @CurrentDate; 
    END; 
CLOSE my; 
DEALLOCATE my; 
SELECT * 
FROM #Results; 

通常不喜歡使用遊標,但它的快速小數據,並且容易在每個日期的基礎評估..

你的結果是接近的,但不是我得到的結果,沒有時間d iagnose你的查詢,所以用這個來比較和對比。

考慮您發佈此年03月17日,我猜測和希望,如果這是家庭作業,其良好逾期現在......我不幫你騙東西..

祝你好運!

結果:

enter image description here