进数

2017-08-09 19 views
0

我在SQL Server 2005中下表(不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 : “将一个累进数字分配给同一组城市,地区和街道的记录”。顺序号的顺序无关紧要。

在Luca Rossi,Mario Verdi和Luigi Carli都住在佛罗伦萨葡萄酒街的例子中,他们有三种不同的GeoCode数字。 Giovanni Casagande和Giuseppe Giusti都住在威尼斯,但在不同的街道上,所以他们有相同的GeoCode编号。

如何自动生成GeoCodeNum?

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

我不知道如何开始,我试过用MS Excel,但它没有帮助。

+1

是存储在数据库中的这个新的价值意向,或者只是为了显示目的使用它?这个问题被标记为'sql',但你声明你最初的尝试是用'MS Excel',这是非常不同的。 –

+0

这在2008年会更容易 - 无法访问? – ChrisV

+0

@Peter Abolins只显示查询结果中的值。我没有用SQL得到任何有用的结果,所以我尝试在Excel中导出结果并使用一些函数,这就是我没有插入Excel标记的原因。 – Nicolaesse

回答

2
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

+0

@Rokuto真的吗?你能发布证明链接吗?我在使用它2年之后才迁移到2008 R2 – sepupic

+0

对不起,我的坏。我查看了[this](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/row-number-transact-sql),但我忘记了2005年推出了“ROW_NUMBER”再一次,对不起。 – Rokuto

+0

非常感谢@sepupic。这正是我所期待的! – Nicolaesse

0

我觉得这个结果你期待

;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 
0
SELECT city, 
     region, 
     street, 
     NAME, 
     surname, 
     Row_number() 
     OVER ( 
      partition BY city, region, street 
      ORDER BY NAME ASC) AS GeoCodeNum 
FROM customeraddress; 
+0

不仅仅发布一个答案,你可以添加一些解释来更好地理解OP和未来的读者。 –