如何在 group by 和 join 后找到最大值?
How to find maximum value after a group by and joins?
如何使用两个联接和分组依据获得用户名的最大收入?我希望得到一行是用户名和最大收入。之所以需要先求和,是因为用户可能有多个不同的视频提供 him/her 收入。因此,必须汇总收入。
我试过这个:
SELECT first_username||' '||last_username as username, max(sum(revenue)) max_revenue
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username;
这会导致“不是单组组函数”错误。有其他方法吗?
在下面的查询中,我使用 RANK
分析函数来 return 任何具有最大收入的内容创建者。如果 2 位或更多内容创作者的收入相同,那么他们都将被 returned。如果您只需要 1 行 returned,那么您可以将 RANK
函数更改为 ROW_NUMBER
函数。
WITH
sample_data (first_username, last_username, revenue)
AS
(SELECT 'Marques', 'Brownlee', 4030 FROM DUAL
UNION ALL
SELECT 'Marques', 'Brownlee', 8724 FROM DUAL
UNION ALL
SELECT 'Linus', 'Sebastian', 5731 FROM DUAL
UNION ALL
SELECT 'Linus', 'Sebastian', 7372 FROM DUAL)
SELECT username, sum_revenue AS max_revenue
FROM (SELECT username, sum_revenue, RANK () OVER (ORDER BY sum_revenue DESC) AS revenue_rank
FROM ( SELECT first_username || ' ' || last_username AS username,
SUM (revenue) AS sum_revenue
FROM /*content_creators
JOIN video ON video.uploader_id = uploader.uploader_id
JOIN users ON uploader.user_id = users.user_id*/
sample_data
GROUP BY first_username || ' ' || last_username))
WHERE revenue_rank = 1;
错误原因是您正在使用嵌套聚合,
使用一级子查询再次获取max
值
SELECT username,max(revenue_total) max_revenue
FROM
(
SELECT first_username||' '||last_username as username, sum(revenue) revenue_total
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username
)
GROUP BY username;
编辑:即兴回答
上面的查询确实解决了错误,但对于这个用例来说并不是很有用。所以我们可以这样做,
SELECT username,revenue_total max_revenue
FROM
(
SELECT first_username||' '||last_username as username, sum(revenue) revenue_total
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username
)
ORDER BY revenue_total DESC
FETCH FIRST ROW ONLY;
注意:也可以在没有内部子查询的情况下完成,但我更喜欢可读性目的。
如何使用两个联接和分组依据获得用户名的最大收入?我希望得到一行是用户名和最大收入。之所以需要先求和,是因为用户可能有多个不同的视频提供 him/her 收入。因此,必须汇总收入。
我试过这个:
SELECT first_username||' '||last_username as username, max(sum(revenue)) max_revenue
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username;
这会导致“不是单组组函数”错误。有其他方法吗?
在下面的查询中,我使用 RANK
分析函数来 return 任何具有最大收入的内容创建者。如果 2 位或更多内容创作者的收入相同,那么他们都将被 returned。如果您只需要 1 行 returned,那么您可以将 RANK
函数更改为 ROW_NUMBER
函数。
WITH
sample_data (first_username, last_username, revenue)
AS
(SELECT 'Marques', 'Brownlee', 4030 FROM DUAL
UNION ALL
SELECT 'Marques', 'Brownlee', 8724 FROM DUAL
UNION ALL
SELECT 'Linus', 'Sebastian', 5731 FROM DUAL
UNION ALL
SELECT 'Linus', 'Sebastian', 7372 FROM DUAL)
SELECT username, sum_revenue AS max_revenue
FROM (SELECT username, sum_revenue, RANK () OVER (ORDER BY sum_revenue DESC) AS revenue_rank
FROM ( SELECT first_username || ' ' || last_username AS username,
SUM (revenue) AS sum_revenue
FROM /*content_creators
JOIN video ON video.uploader_id = uploader.uploader_id
JOIN users ON uploader.user_id = users.user_id*/
sample_data
GROUP BY first_username || ' ' || last_username))
WHERE revenue_rank = 1;
错误原因是您正在使用嵌套聚合,
使用一级子查询再次获取max
值
SELECT username,max(revenue_total) max_revenue
FROM
(
SELECT first_username||' '||last_username as username, sum(revenue) revenue_total
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username
)
GROUP BY username;
编辑:即兴回答
上面的查询确实解决了错误,但对于这个用例来说并不是很有用。所以我们可以这样做,
SELECT username,revenue_total max_revenue
FROM
(
SELECT first_username||' '||last_username as username, sum(revenue) revenue_total
FROM uploader
JOIN video on video.uploader_id= uploader.uploader_id
JOIN users on uploader.user_id = users.user_id
GROUP BY first_username||' '||last_username
)
ORDER BY revenue_total DESC
FETCH FIRST ROW ONLY;
注意:也可以在没有内部子查询的情况下完成,但我更喜欢可读性目的。