Sql 在将为每个唯一主键分配唯一ID的视图中插入一列
我正在尝试在SQL Server 2012的视图中插入一个新列,以便为每个唯一的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
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)