2017-09-25 130 views
0

我想解決this HackerRank SQL coding challenge。我們有兩個表格,一個名爲Hackers,列爲hacker_idname,另一個表格爲Submissions,列爲submission_date,submission_idhacker_idscoreMySQL解釋器調用沒有聚合函數的查詢聚合查詢

一個查詢我提交解決面臨的挑戰是:

SELECT es.date, es.count, m.hacker_id, m.name, m.score 
FROM 
(
    SELECT submission_date as date, COUNT(hacker_id) as count 
    FROM (
     SELECT submission_date, COUNT(submission_id) as count, hacker_id 
     FROM Submissions 
     GROUP BY submission_date, hacker_id 
    ) f 
    HAVING count >=1 
) es 
JOIN (
    SELECT s.submission_date as date, s.hacker_id, h.name, s.score 
    FROM Submissions s 
    JOIN Hackers h ON h.hacker_id = s.hacker_id 
    JOIN (SELECT submission_date, MAX(score) as score FROM Submissions GROUP BY submission_date) foo ON foo.submission_date = s.submission_date 
    WHERE s.score = foo.score 
) m 
ON es.date = m.date 
ORDER BY es.date 

不過,我回來了錯誤:

ERROR 1140 (42000) at line 1: In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'f.submission_date'; this is incompatible with sql_mode=only_full_group_by 

這確實讓我感到困惑,因爲我沒有使用聚合函數我的查詢。爲什麼口譯員會給出這個錯誤,我應該考慮如何解決這個錯誤?

回答

0

第一個子查詢中有兩列名爲count。一個是字段submission_id的計數,第二個是hacker_id的計數。根據我的理解,查詢需要執行select_dates選項,其中count大於或等於1.因此取決於哪個計數被推測爲大於或等於1,查詢可能被重寫爲如下:

1)If它是需要的是計數(submission_id)大於或等於1:

SELECT es.date, es.count, m.hacker_id, m.name, m.score 
FROM 
(
SELECT submission_date as date, COUNT(hacker_id) as count 
FROM (
    SELECT submission_date, COUNT(submission_id) as count, hacker_id 
    FROM Submissions 
    GROUP BY submission_date, hacker_id 
) f 
WHERE f.count >=1 
GROUP BY submission_date 
) es 
JOIN (
    SELECT s.submission_date as date, s.hacker_id, h.name, s.score 
    FROM Submissions s 
JOIN Hackers h ON h.hacker_id = s.hacker_id 
JOIN (SELECT submission_date, MAX(score) as score FROM Submissions GROUP BY submission_date) foo ON foo.submission_date = s.submission_date 
WHERE s.score = foo.score 
) m 
ON es.date = m.date 
ORDER BY es.date 

2)的計數(hacker_id)大於或等於1:

SELECT es.date, es.count, m.hacker_id, m.name, m.score 
FROM 
(
SELECT submission_date as date, COUNT(hacker_id) as count 
FROM (
    SELECT submission_date, COUNT(submission_id) as count, hacker_id 
    FROM Submissions 
    GROUP BY submission_date, hacker_id 
) f 
GROUP BY submission_date 
HAVING count(hacker_id) >= 1 
) es 
JOIN (
    SELECT s.submission_date as date, s.hacker_id, h.name, s.score 
    FROM Submissions s 
JOIN Hackers h ON h.hacker_id = s.hacker_id 
JOIN (SELECT submission_date, MAX(score) as score FROM Submissions GROUP BY submission_date) foo ON foo.submission_date = s.submission_date 
WHERE s.score = foo.score 
) m 
ON es.date = m.date 
ORDER BY es.date 

的問題是,在子查詢聚合函數計數(hacker_id)沒有使用「gr」 oup by「部分的列」submission_date「定義爲nonaggregated列。 仍然我不確定sql查詢在邏輯上是否正確。