2017-09-25 21 views
0

this HackerRank SQL coding challengeを解決しようとしています。 Hackersという列とhacker_idnameという列とSubmissionsという列とsubmission_datesubmission_idhacker_id、およびscoreという列の2つのテーブルがあります。私は挑戦を解決するために提出したMySQLインタプリタは、集計関数なしのクエリを集約クエリと呼びます。

つのクエリは:

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という名前の2つの列があります。 1つはsubmission_idフィールドのカウントで、もう1つはhacker_idのカウントです。私はクエリがsubmission_datesの選択を実行する必要があると理解しているので、1より大きいか等しい。カウントが1以上と推定される場合、クエリは次のように書き直されることがある。

1)カウント(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 
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):そのカウント(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 
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 "が非集約列として定義されています。 まだSQLクエリが論理的に正しいかどうかはわかりません。