【问题标题】:Counter increment for duplicate data from 2 columns来自 2 列的重复数据的计数器增量
【发布时间】:2017-09-19 06:40:29
【问题描述】:

我在一个表中有 2 列:column1,priority。
他们的数据如下所示。

+--------------------------+
|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

我得到以下结果:

+---------------------------------------------+
|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            |
+--------------------------+------------------+

但我要求的值如下: 就像如果连接的值已经存在,而不是在下一个优先级列值中增加,而不是将它与 column1 连接。例如:如果 15 已经存在,那么优先级值的增加使其 6 比连接并获得 25 到 26 的 16 相同。

+---------------------------------------------+
|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            |
+--------------------------+------------------+

【问题讨论】:

  • 这听起来像是一场维护噩梦,而且容易出错。您是否考虑过使用自动增量列?失败了,您是否考虑过在查询时简单地生成您想要的序列?
  • 是sql server 2008还是2012? c# 与它有什么关系?
  • 听起来像是糟糕的数据库设计
  • @ZoharPeled 2012
  • “已经存在”意味着一些排序,但我在表中看不到排序列。

标签: sql sql-server-2012 sql-server-2008-r2


【解决方案1】:

试试这个

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。不知道对不对。

编辑如果您的数据库兼容级别为 2008 或更低,请使用

'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;正在返回 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service包 1)(管理程序)
  • @Serg 仍然不正确:dbfiddle.uk/… 没有程序代码就无法实现;)
  • @serg 奇怪的是他在你的回答中接受了我的解决方案:D
  • @RadimBača,我猜我的第二个版本 max(n) over () 是正确的。
  • @serg '我的猜测'?我向您发送了一个链接,您可以在其中看到它无法正常工作,并且您回答“我的猜测是正确的”?
【解决方案2】:

好的,我有一个只在某些情况下有效的半解决方案(例如对于您的示例数据)。

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;正在返回 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service包 1)(管理程序)
  • @Brainiac 嘿,brainiac,例如改用CAST。串联是一个有据可查的问题
  • 你能给我 SQL Server 2008 R2 的示例查询
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2017-04-30
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多