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() 更新列

Row_Number() OVER PARTITION BY 基于列中的值

需要使用 row_number() 过滤 3 列

Oracle:row_number()rank()dense_rank()

PostgreSQL 窗口函数:row_number() over (partition col order by col2)

窗口函数 ROW_NUMBER() 使用变量 RUNNING TOTAL 更改处理 ORDER BY