Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-为每次出现的值添加一个计数器_Sql_Sql Server_Select_Count - Fatal编程技术网

SQL-为每次出现的值添加一个计数器

SQL-为每次出现的值添加一个计数器,sql,sql-server,select,count,Sql,Sql Server,Select,Count,我有一个简单的select,返回类似 例如,从sourcetabel中选择ColumnA、ColumnB、ColumnC 现在我想在这里有一个计数器,它可以执行以下操作: 每次在A列中找到一个匹配项时,它都会在B列中添加一个数字 这意味着: Column A - Column B - Column C John - Something **1** - 123 John - Something **2** - 456 Mark - Something **1**

我有一个简单的select,返回类似 例如,从sourcetabel中选择ColumnA、ColumnB、ColumnC

现在我想在这里有一个计数器,它可以执行以下操作: 每次在A列中找到一个匹配项时,它都会在B列中添加一个数字 这意味着:

Column A - Column B   - Column C
John     - Something **1**  - 123
John     - Something **2**  - 456
Mark     - Something **1**  - 123
Mark     - Something **2**  - 456
有人知道我怎么能轻松做到这一点吗

仅供参考:我正在使用MSSQL

谢谢

您可以使用concat和ANSI标准行数函数:

select a,
       concat(a, ' **', row_number() over (partition by a, b order by b), '**') as new_b,
       c
from t;
SELECT A, B, C, ROW_NUMBER() OVER(PARTITION BY A,B,C ORDER BY (SELECT NULL))
FROM TableName

concat的确切功能因数据库而异。

如果您的数据库支持,请使用行数功能:

select a,
       concat(a, ' **', row_number() over (partition by a, b order by b), '**') as new_b,
       c
from t;
SELECT A, B, C, ROW_NUMBER() OVER(PARTITION BY A,B,C ORDER BY (SELECT NULL))
FROM TableName
行的顺序是任意的,因为它们对于MSSQL来说无论如何都是相同的

按名字顺序选择A、B+castROW_编号的超额部分 从sourcetabel中选择NULL作为varchar10作为B,C


按条款分组使用您使用的关系型数据库是什么?什么版本?分区似乎是必需的,否则每行只需要一个计数器@GordonLinoff你的例子很好地解释了我的问题!顺便说一句**只是为了降价:我只需要这个号码