ROW_NUMBER 超过列结果

ROW_NUMBER over column result

如何计算给定列中出现的次数?

按照这个例子。使用这样的 table:

+----------+---------+------+
| 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 |
+----------+---------+------+-------------+

我必须在 SUM 上使用 ROW_NUMBER 函数吗?

如果我没理解错的话,你只是想枚举每个城市的值,然后按 id:

排序
select t.*
from (select t.*,
             row_number() over (partition by city
                                order by personid) as CityCounter
      from table t
     ) t
order by personid;

用row_number()解析函数可以得到结果,但是没有over SUM? 您可以阅读 online 有关使用 row_number() 及其正确语法的文档。

在你的情况下,你想对每个城市的出现进行编号,这意味着你需要按城市分组(按城市划分),然后你需要为你的排序提供逻辑,哪条城市线应该排在第一位, personID 是第一个吗?

您的 row_number 将如下所示:

row_number() over(partition by city order by personID)

就这么简单

SELECT *,
       cityCounter = ROW_NUMBER() OVER (PARTITION BY city ORDER BY personID)
FROM yourTable
ORDER BY personID