Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 在将为每个唯一主键分配唯一ID的视图中插入一列_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 在将为每个唯一主键分配唯一ID的视图中插入一列

Sql 在将为每个唯一主键分配唯一ID的视图中插入一列,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我正在尝试在SQL Server 2012的视图中插入一个新列,以便为每个唯一的TxnID分配一个新编号 目前,TxnID的长度为28个字符。如果我能为每个TxnID分配一个以“1”开头的新数字,那就太好了 Current TxnID ------------------------- 2010100009000010000006783 2010100009000010000006784 2010100009000010000006785 2010100009000010000006785

我正在尝试在SQL Server 2012的视图中插入一个新列,以便为每个唯一的
TxnID
分配一个新编号

目前,TxnID的长度为28个字符。如果我能为每个
TxnID
分配一个以“1”开头的新数字,那就太好了

Current TxnID 
-------------------------
2010100009000010000006783
2010100009000010000006784
2010100009000010000006785
2010100009000010000006785
理想TxnID

1
2
3
3

使用排名函数
rank()
,这会有所帮助

select *, rank() over (order by TxnID) TxnID from table 
使用行号()


为此,我们可以使用多种方法-

--秩()

--密秩

SELECT * , DENSE_RANK() OVER (ORDER BY [Current TxnID]) rowNumx FROM (
SELECT '2010100009000010000006783' [Current TxnID] UNION ALL
SELECT '2010100009000010000006784' UNION ALL
SELECT '2010100009000010000006785' UNION ALL
SELECT '2010100009000010000006785' )p
--其他

SELECT * , RANK() OVER (ORDER BY [Current TxnID]) rowNumx FROM (
SELECT '2010100009000010000006783' [Current TxnID] UNION ALL
SELECT '2010100009000010000006784' UNION ALL
SELECT '2010100009000010000006785' UNION ALL
SELECT '2010100009000010000006785' )p
SELECT * , DENSE_RANK() OVER (ORDER BY [Current TxnID]) rowNumx FROM (
SELECT '2010100009000010000006783' [Current TxnID] UNION ALL
SELECT '2010100009000010000006784' UNION ALL
SELECT '2010100009000010000006785' UNION ALL
SELECT '2010100009000010000006785' )p
;WITH CTE AS
(
    SELECT '2010100009000010000006783' [Current TxnID] UNION ALL
    SELECT '2010100009000010000006784' UNION ALL
    SELECT '2010100009000010000006785' UNION ALL
    SELECT '2010100009000010000006785' 
)
SELECT [Current TxnID], rowNumx = ( SELECT COUNT(*)+1 FROM CTE c1 WHERE c1.[Current TxnID] < c.[Current TxnID] )
FROM CTE c
/*------------------------
OUTPUT
------------------------*/
Current TxnID             rowNumx
------------------------- --------------------
2010100009000010000006783 1
2010100009000010000006784 2
2010100009000010000006785 3
2010100009000010000006785 3

(4 row(s) affected)