2017-03-17 1 views
1

문제점을 해결하기 위해 노력 중이며 해결책을 찾았습니다. 필자가 작성한 솔루션은 작은 데이터 세트에서 작동하지만 큰 데이터 세트에서는 제대로 작동하지 않는 것 같습니다. 누군가 내가 잘못하고있는 걸 도와 줄 수 있니?큰 샘플에서 SQL이 작동하지 않습니다.

매일 (출력의 두 번째 열) 순 사용자를 계산하는 데 문제가 있습니다. 로직의 나머지는 잘 작동합니다.

줄리아는 15 일간 SQL 경연 대회를 실시했습니다. 대회 시작일은 2016 년 3 월 1 일이었으며 종료일은 2016 년 3 월 15 일이었습니다.

매일 제출 한 적이있는 고유 해커의 총수 경연 대회), 해커의 이름과 해커의 이름을 찾으십시오. 해커 중 최대 수가 1 명 이상인 경우 가장 낮은 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 년

해커 테이블 : 잠수함 sions 표 : 2016년 3월 1일에

**Explanation :-** 

해커, 및 제출했다. 매일 적어도 하나의 제출물을 만든 독특한 해커가 있습니다. 각 해커가 하나의 제출을 ​​한 것처럼 이날 최대 수의 제출자를 만든 해커로 간주됩니다. 해커의 이름은 Angela입니다.

2016 년 3 월 2 일에 해커가 제출하여 제출했습니다. 이제는 매일 제출해야하는 유일한 사람 이었으므로 매일 적어도 하나의 제출을 ​​한 독특한 해커가 있습니다. 해커 이름은 마이클입니다.

2016 년 3 월 3 일에 해커가 제출하여 제출했습니다. 지금은 유일한 사람들 이었으므로 매일 적어도 하나의 제출을 ​​한 독특한 해커가 있습니다. 각 해커가 하나의 제출을 ​​했으므로이 날 최대 제출자를 만든 해커로 간주됩니다. 해커의 이름은 Angela입니다.

2014 년 3 월 4 일에 해커,, 및 제출을 제출했습니다. 지금은 매일 제출 만 했으므로 매일 적어도 하나의 제출을 ​​한 독특한 해커가 있습니다. 각 해커가 하나의 제출을 ​​했으므로이 날 최대 제출자를 만든 해커로 간주됩니다. 해커의 이름은 Angela입니다.

2016 년 3 월 5 일에 해커가 제출하여 제출했습니다. 이제는 매일 제출되기 때문에 매일 적어도 하나의 제출을 ​​한 유일한 해커 만 있습니다. 제출 된 해커 이름은 Frank입니다.

2016 년 3 월 6 일에만 제출되었으므로 매일 적어도 하나의 제출을 ​​한 유일한 해커가 있습니다. 해커의 제출 및 이름은 Angela입니다.

샘플 출력

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

나는 "그것을 잘 작동하지 않는 것"정확히 당신이 무슨 뜻 이죠 스키마와 데이터 .... – Teja

+0

를 만들 수 sqlfiddle 링크를 추가? – 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; 

하지 마십시오 일반적으로 커서를 사용하여 좋아하지만, 작은 데이터를 신속하고 날짜별로 평가하기 쉽게 ...

결과가 비슷하지만 같지 않습니다. 시간이 없습니다. 귀하의 쿼리를 iagnose, 그래서 비교 및 ​​대조를 사용하십시오. ,

하면 3 월 17 일에 게시 고려, 나는 추측하고있어이 숙제 인 경우 기대는 잘 기한이 지난 지금 ... 그리고 난 당신이 뭔가 속임수 ..

행운을 빕니다 도움이되지 않았다!

결과 :

enter image description here

관련 문제