名字 | 年龄 |
---|---|
约翰 | 31 |
约翰 | 25 |
贝蒂 | 28 |
大卫 | 22 |
罗伯特 | 22 |
WITH cte AS (
SELECT first_name,age,
ROW_NUMBER() OVER (PARTITION BY first_name ORDER BY SUM(age) DESC) AS row_num
FROM customers
)
SELECT *
FROM cte
我得到这个输出。任何人都可以解释为什么吗?
名字 | 年龄 | 行数 |
---|---|---|
约翰 | 31 | 1 |
一些评论者指出,您需要在 select 语句中进行一些聚合才能完成这项工作。这个查询应该有效:
WITH cte (first_name, age, row_num) AS (
SELECT
first_name,
sum(age),
ROW_NUMBER() OVER (PARTITION BY first_name ORDER BY SUM(age) DESC) AS row_num
FROM customers
group by first_name
)
SELECT *
FROM cte
;
结果如下所示:
first_name age row_num
betty 28 1
david 22 1
john 56 1
robert 22 1
由于您选择了
SUM(age)
,因此具有 first_name = 'john'
的行是唯一受到影响的行,因为您的 PARTITION
位于 first_name
旁边,而我添加的 GROUP BY
位于同一列。
顺便说一句,其中一个评论者提供了一个链接,它具有相同的方法(刚刚发现,并且谢天谢地,解决方案基本上是相同的,除了我没有包含为创建临时表的代码)测试;很好,那)。 MySQL fiddle 站点的好处是,如果查询成功运行,您可以看到结果。您确实必须构建自己的临时表,正如评论者所做的那样。
无论哪种方式,如果包含附加聚合,查询都会返回结果。更大的问题是:这些是你想要的结果吗?如果没有,您可能需要解释一下您希望返回的内容,我相信人们会做出相应的回应。