来自2列的重复数据的计数器增量

问题描述:

我在表中有2列:column1,priority。
他们的数据如下所示。来自2列的重复数据的计数器增量

+--------------------------+ 
|code | column1 | Priority | 
+--------------------------+ 
| 1001| 1  | 1  | 
| 1001| 2  | 1  | 
| 1002| 1  | 2  | 
| 1002| 2  | 2  | 
| 1003| 1  | 3  | 
| 1004| 2  | 4  | 
| 1005| 1  | 5  | 
| 1005| 2  | 5  | 
| 1006| 1  | 5  | 
| 1006| 2  | 5  | 
| 1007| 1  | 5  | 
| 1007| 2  | 5  | 
+--------------------------+ 

如果我通过

select 'con' + column1 + Priority 
from T1 

串连这2列我得到以下结果:

+---------------------------------------------+ 
|code | column1 | Priority | (No column name) | 
+--------------------------+------------------+ 
| 1001| 1  | 1  | con11   | 
| 1001| 2  | 1  | con21   | 
| 1002| 1  | 2  | con12   | 
| 1002| 2  | 2  | con22   | 
| 1003| 1  | 3  | con13   | 
| 1004| 2  | 4  | con24   | 
| 1005| 1  | 5  | con15   | 
| 1005| 2  | 5  | con25   | 
| 1006| 1  | 5  | con15   | 
| 1006| 2  | 5  | con25   | 
| 1007| 1  | 5  | con15   | 
| 1007| 2  | 5  | con25   | 
+--------------------------+------------------+ 

但我需要的值要像以下: 一样,如果级联数值已经存在比在下一个优先级列值中递增并且将其与列1连接在一起。 E:如果15比增量已经存在于优先值g,使其比6和串联得到16同样为25至26

+---------------------------------------------+ 
|code | column1 | Priority | (No column name) | 
+--------------------------+------------------+ 
| 1001| 1  | 1  | con11   | 
| 1001| 2  | 1  | con21   | 
| 1002| 1  | 2  | con12   | 
| 1002| 2  | 2  | con22   | 
| 1003| 1  | 3  | con13   | 
| 1004| 2  | 4  | con24   | 
| 1005| 1  | 5  | con15   | 
| 1005| 2  | 5  | con25   | 
| 1006| 1  | 5  | con16   | 
| 1006| 2  | 5  | con26   | 
| 1007| 1  | 5  | con17   | 
| 1007| 2  | 5  | con27   | 
+--------------------------+------------------+ 
+0

这听起来像一个维护的噩梦,也容易出错。你有没有看过使用自动增量列?那失败了,你是否考虑过在查询时简单地生成你想要的序列? –

+0

是sql server 2008还是2012? c#和它有什么关系? –

+0

听起来像坏的数据库设计 – Magisch

试试这个

select code,column1, Priority, 
    concat('con', column1, Priority - 1 + row_number() over(partition by Priority, column1 order by code)) 
from myTable 
order by code, column1; 

这将返回一行

1007 3 5 con35 

1007 3 5 

添加到myTable的。不知道这是否正确。

编辑如果你的数据库兼容级别是08或更低的使用

'con' + cast (column1 as varchar(20)) + cast(Priority - 1 + row_number() over(partition by Priority, column1 order by code) as varchar(20)) 

,如果您需要在添加1007 3 5con37,试试这个

select code,column1, Priority, cn ='con' + cast (column1 as varchar(20)) + cast(max(n) over (partition by code) as varchar(20)) 
from (
    select code,column1, Priority, n=Priority - 1 + row_number() over(partition by Priority, column1 order by code) 
    from myTable 
) t 
order by code, column1 
+0

'concat'不是一个公认的内置函数名称。 安装了sql server 2012,但是安装了 SELECT @@ VERSION;在Windows NT 6.1 10.50.1617.0(X64) \t 2011年4月22日19点23分43秒 \t版权所有(c)Microsoft公司 \t企业版(64位) - 正在恢复的Microsoft SQL Server 2008 R2(RTM) (内部版本7601:Service Pack 1)(管理程序) – Brainiac

+0

@Serg正如我在回答中所提到的,它不适用于任何数据... –

+0

@RadimBača,请参阅编辑 – Serg

好吧,我有这样只能在某些情况下(例如半的解决方案为您的示例数据)。

select column1, priority, 
    'con' + CAST(column1 AS VARCHAR(10)) + 
      CAST((row_number() over (partition by column1, priority order by priority) + priority - 1) AS VARCHAR(10)) 
from tab 

如果将例如(1,6)插入到您的数据中,那么您将有两次con16问题。 Here是有问题的数据解决方案的一个例子。

+0

'concat'不是公认的内置函数名称。 安装了sql server 2012,但是安装了 SELECT @@ VERSION;在Windows NT 6.1 10.50.1617.0(X64) \t 2011年4月22日19点23分43秒 \t版权所有(c)Microsoft公司 \t企业版(64位) - 正在恢复的Microsoft SQL Server 2008 R2(RTM) (内部版本7601:Service Pack 1)(管理程序) – Brainiac

+0

@Brainiac嘿脑残,用例如'CAST'代替。连接是一个有据可查的问题 –

+0

可以给我示例查询SQL Server 2008 R2 – Brainiac