来自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 |
+--------------------------+------------------+
试试这个
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 5
con37
,试试这个
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
'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)
@Serg正如我在回答中所提到的,它不适用于任何数据... –
@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是有问题的数据解决方案的一个例子。
'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)
@Brainiac嘿脑残,用例如'CAST'代替。连接是一个有据可查的问题 –
可以给我示例查询SQL Server 2008 R2 – Brainiac
这听起来像一个维护的噩梦,也容易出错。你有没有看过使用自动增量列?那失败了,你是否考虑过在查询时简单地生成你想要的序列? –
是sql server 2008还是2012? c#和它有什么关系? –
听起来像坏的数据库设计 – Magisch