SQL - 基于其他列的自动编号列

时间:2015-11-15 02:05:13

标签: sql if-statement case

我一直试图用IF和CASE WHEN语句来解决我的问题,但我没有得到我需要的结果,我希望你能帮助我。

假设我有这张表:

Client | address
----------------
John   | add1
John   | add2
Fred   | add1
Amy    | add1
Amy    | add2
Amy    | add3

1)如何为每个不同的客户在新列(ID)中设置递增值,以获得此结果:

ID | Client | address
---------------------
1  | John   | add1
1  | John   | add2
2  | Fred   | add1
3  | Amy    | add1
3  | Amy    | add2
4  | Amy    | add3

2)如何为具有不同地址的每个不同客户在新列(站点)中设置递增值,以获得此结果:

ID | Site | Client | address
----------------------------
1  | 1    | John   | add1
1  | 2    | John   | add2
2  | 1    | Fred   | add1
3  | 1    | Amy    | add1
3  | 2    | Amy    | add2
4  | 3    | Amy    | add3

最诚挚的问候, 埃利奥·费尔南德斯

2 个答案:

答案 0 :(得分:0)

我认为最好是使用伪索引表进行JOIN

SET @clientId=0;

SELECT idc.clientId, t.*
FROM `table` as t
INNER JOIN (
    SELECT address, @clientId:=@clientId+1 AS clientId
    FROM `table`
    ) as idc
    ON idc.address = t.address

对于第2部分来说,它是相同的

答案 1 :(得分:0)

您可以使用窗口函数执行此操作:

select dense_rank() over (order by client) as id,
       row_number() over (partition by client order by address) as site,
       client, address
from t;

这些是ANSI标准函数,可在大多数数据库中使用。