2017-03-17 6 views
1

私は課題を解決しようとしており、解決策を考え出しました。私が書いた解決策は、小さなデータセットでは機能しますが、大きなものではうまく機能しないようです。誰かが私が間違っていることを助けてくれますか?大きなサンプルでSQLが動作しない

私は毎日の一意のユーザーを計算することに問題があります(出力の2番目の列)。残りのロジックは正常に動作します。

ジュリアは、SQLコンテストの15日間の学習を行った。コンテストの開始日は2016年3月1日で、終了日は2016年3月15日でした。

少なくとも1日に提出したユニークなハッカーの総数を印刷するクエリを作成します(最初の日からコンテスト)、毎日最大数の投稿を行ったハッカーのhacker_idと名前を見つけます。そのようなハッカーが複数提出している場合は、最低のhacker_idを出力してください。クエリはコンテストの各日にこの情報を日付でソートして表示する必要があります。

ハッカー:

入力形式

次の表は、コンテストのデータを保持hacker_idはハッカーのIDであり、名前はハッカーの名前 です。

enter image description here

提出:submission_dateは、submission_idは、hacker_idが提出をしたハッカーのIDで提出のIDであり、スコアがスコアで提出の日付です提出次のサンプル入力の場合

enter image description here

サンプル入力

enter image description here

enter image description here

、コンテストの終了日が3月6日、2016年

だったと仮定

ハッカーテーブル:サブミット表:

**Explanation :-** 

2016年3月1日に、ハッカー、および、提出されました。毎日少なくとも1つの投稿を行ったユニークなハッカーがいます。各ハッカーが1つの提出を行ったので、この日に最大数の提出を行ったハッカーとみなされます。ハッカーの名前はアンジェラです。

2016年3月2日、ハッカー、および提出を行いました。今では毎日提出するのは唯一のものなので、毎日少なくとも1回提出したユニークなハッカーがいます。ハッカーの名前はマイケルです。

2016年3月3日に、ハッカー、および提出を行いました。今や唯一のものだったので、毎日少なくとも1回提出した独特のハッカーがいます。各ハッカーが1つの提出を行ったので、この日に最大数の提出を行ったハッカーとみなされます。ハッカーの名前はアンジェラです。

2016年3月4日に、ハッカー、、および提出しました。現在、毎日提出されているだけなので、毎日少なくとも1回提出したユニークなハッカーがいます。各ハッカーが1つの提出を行ったので、この日に最大数の提出を行ったハッカーとみなされます。ハッカーの名前はアンジェラです。

2016年3月5日に、ハッカー、および提出を行いました。現在は毎日提出されているだけなので、毎日少なくとも1件の投稿を行ったユニークなハッカーしかいません。ハッカーの提出物と名前はフランクです。

2016年3月6日にのみ提出されたため、毎日少なくとも1件の投稿を行ったユニークなハッカーしかいません。ハッカーの提出と名前はアンジェラです。

サンプル出力

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の 'colleges'テーブルとの関係は何ですか? –

答えて

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; 

は通常、カーソルを使用して好きではないが、それは小さなデータのための迅速、日付ごとに評価することは簡単です。..

あなたの結果は近いが、私が得たものと同じではなく、時間がないあなたの質問を削除してください。 、

あなたは月17日にこの投稿を考えると、私は推測していると、これは宿題だった場合を望んそのほか延滞今...と私はあなたが何かでカンニング..

幸運を助けていません!

結果:

enter image description here

関連する問題