2017-09-25 134 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查询在逻辑上是否正确。