ROW_NUMBER 列结果
Posted
技术标签:
【中文标题】ROW_NUMBER 列结果【英文标题】:ROW_NUMBER over column result 【发布时间】:2015-05-15 17:11:45 【问题描述】:如何计算给定列中出现的次数?
按照这个例子。像这样的表:
+----------+---------+------+
| PersonID | Name | City |
+----------+---------+------+
| 1 | John | NY |
| 2 | Mohit | CA |
| 3 | Jay | AZ |
| 4 | Roger | NY |
| 5 | David | NY |
| 6 | Peter | AZ |
| 7 | Ana | NY |
| 8 | Irina | NY |
| 9 | Michael | NY |
| 10 | Ken | AZ |
+----------+---------+------+
我怎样才能做到这一点?
+----------+---------+------+-------------+
| PersonID | Name | City | CityCounter |
+----------+---------+------+-------------+
| 1 | John | NY | 1 |
| 2 | Mohit | CA | 1 |
| 3 | Jay | AZ | 1 |
| 4 | Roger | NY | 2 |
| 5 | David | NY | 3 |
| 6 | Peter | AZ | 2 |
| 7 | Ana | NY | 4 |
| 8 | Irina | NY | 5 |
| 9 | Michael | NY | 6 |
| 10 | Ken | AZ | 3 |
+----------+---------+------+-------------+
我必须使用 ROW_NUMBER 函数而不是 SUM 吗?
【问题讨论】:
【参考方案1】:就这么简单。
SELECT *,
cityCounter = ROW_NUMBER() OVER (PARTITION BY city ORDER BY personID)
FROM yourTable
ORDER BY personID
【讨论】:
【参考方案2】:如果我理解正确,您只想枚举每个城市的值,然后按id
排序:
select t.*
from (select t.*,
row_number() over (partition by city
order by personid) as CityCounter
from table t
) t
order by personid;
【讨论】:
【参考方案3】:使用row_number()解析函数可以得到结果但是没有over SUM? 您可以阅读online 文档,了解有关使用 row_number() 及其正确语法的信息。
在您的情况下,您想要对每个城市的出现次数进行编号,这意味着您需要按城市分组(按城市分区),然后您需要为您的排序提供逻辑,哪个城市线应该是第一个,是吗personID 什么时候出现?
您的 row_number 将如下所示:
row_number() over(partition by city order by personID)
【讨论】:
以上是关于ROW_NUMBER 列结果的主要内容,如果未能解决你的问题,请参考以下文章
Row_Number() OVER PARTITION BY 基于列中的值
Oracle:row_number()rank()dense_rank()
PostgreSQL 窗口函数:row_number() over (partition col order by col2)