基于某些 SQL 服务器列的累进数字

Progressive number based on some SQL server columns

我在 SQL Server 2005 中有以下 table(没有我要计算的 GeoCodeNum 列)

+-----------+---------+-------------+----------+------------+------------+
|   City    | Region  |   Street    |   Name   |  Surname   | GeoCodeNum |
+-----------+---------+-------------+----------+------------+------------+
| Sydney    | NSW     | Wall street | Chris    | Red        |          1 |
| Sydney    | NSW     | Wall street | Marc     | White      |          2 |
| Sydney    | NSW     | Sea street  | Joseph   | Orange     |          1 |
| Melbourne | VIC     | Ocean orad  | Jess     | Brown      |          1 |
| Florence  | Tuscany | Wine street | Luca     | Rossi      |          1 |
| Florence  | Tuscany | Wine street | Mario    | Verdi      |          2 |
| Florence  | Tuscany | Wine street | Luigi    | Carli      |          3 |
| Florence  | Tuscany | Beer street | Elena    | Sarzetto   |          1 |
| Venice    | Veneto  | Old street  | Giovanni | Casagrande |          1 |
| Venice    | Veneto  | New street  | Giuseppe | Giusti     |          1 |
+-----------+---------+-------------+----------+------------+------------+

我想根据以下规则生成 GeoCodeNum: "assig a progressive number to records with the same set of City, Region and Street and". 递增数顺序无所谓.

在示例中,Luca Rossi、Mario Verdi 和 Luigi Carli 都住在佛罗伦萨的 Wine Street,因此他们有 3 个不同的 GeoCode 编号。 乔瓦尼·卡萨甘德 (Giovanni Casagande) 和朱塞佩·朱斯蒂 (Giuseppe Giusti) 都住在威尼斯,但在不同的街道上,所以他们有相同的 GeoCode 号码。

如何自动生成 GeoCodeNum?

我需要每年生成一次结果,但我有将近 100000 条记录。

我不知道如何开始,我已经尝试使用 MS Excel,但没有帮助。

我认为这个结果在您的意料之中

;With cte(City ,Region, Street,Name ,Surname  )
AS
(
SELECT  'Sydney'    , 'NSW'     , 'Wall street' , 'Chris'    , 'Red'       UNION ALL
SELECT  'Sydney'    , 'NSW'     , 'Wall street' , 'Marc'     , 'White'     UNION ALL
SELECT  'Sydney'    , 'NSW'     , 'Sea street'  , 'Joseph'   , 'Orange'    UNION ALL
SELECT  'Melbourne' , 'VIC'     , 'Ocean orad'  , 'Jess'     , 'Brown'     UNION ALL
SELECT  'Florence'  , 'Tuscany' , 'Wine street' , 'Luca'     , 'Rossi'     UNION ALL
SELECT  'Florence'  , 'Tuscany' , 'Wine street' , 'Mario'    , 'Verdi'     UNION ALL
SELECT  'Florence'  , 'Tuscany' , 'Wine street' , 'Luigi'    , 'Carli'     UNION ALL
SELECT  'Florence'  , 'Tuscany' , 'Beer street' , 'Elena'    , 'Sarzetto'  UNION ALL
SELECT  'Venice'    , 'Veneto'  , 'Old street'  , 'Giovanni' , 'Casagrande'UNION ALL
SELECT  'Venice'    , 'Veneto'  , 'New street'  , 'Giuseppe' , 'Giusti'   
)
SELECT
  City,
  Region,
  Street,
  Name,
  Surname,
  ROW_NUMBER() OVER (PARTITION BY City, Region, Street ORDER BY Street) AS GeoCodeNum
FROM cte
select *,
       row_number() over(partition by City, Region, Street order by Name, Surname) as GeoCodeNum
from yourTable;

Row_number() 首次出现在 SQL Server 2005 中: Row_Number() function in SQL Server 2005

SELECT city, 
       region, 
       street, 
       NAME, 
       surname, 
       Row_number() 
         OVER ( 
           partition BY city, region, street 
           ORDER BY NAME ASC) AS GeoCodeNum 
FROM   customeraddress;