2012-12-04 29 views
2

我有以下数据:SQL查询来获取一个独特seqence

Txn Nmbr Item ID  Desc 
4   1111  Test 1 
6   2222  Test 2 
6   3333  Test 3 
7   4444  Test 4 
7   5555  Test 5 
7   6666  Test 6 

我想多一个COLUMN这是每个“事务处理NMBR的”唯一的序列号所有上述数据。所以输出要求是,

Txn Nmbr Item ID  Desc  Unique Txn 
4   1111  Test 1  1 
6   2222  Test 2  2 
6   3333  Test 3  2 
7   4444  Test 4  3 
7   5555  Test 5  3 
7   6666  Test 6  3 

请帮帮我!提前致谢!

+2

告诉我:你的'独特Txn'从你的'事务处理Nmbr'语义上有什么不同? –

+0

Hello @Anders R. Bystrup:谢谢你的回应。唯一的Txn基本上是每个事务的唯一序列号,所以最后我可以拥有事务的总数。 – user1839815

+0

但你可以通过计算'选择唯一的TxnNmbr'来获得相同的计数...? –

回答

0
select txn_number, 
     item_id, 
     desc, 
     row_number() over (partition by txn_number order by item_id) as unique_txn 
from the_table 
+0

数字仍然重新启动。输出我现在得到的是,事务处理NMBR物品ID说明唯一事务处理 4 1111试验1 1 6 2222测试2 1 6 3333测试3 2 7 4444试验4 1 7 5555试验5 2 7 6666试验6 3 – user1839815

+0

@ user1839815:但您的示例显示,每个txn号码都重新启动了“唯一”号码**。那么你的例子并不符合你的问题。你需要**整个**结果中的唯一编号吗?在这种情况下,只需删除'partition by'部分。 –

1

请尝试:

DECLARE @table as TABLE(TxnNmbr INT, ItemID INT, Descr NVARCHAR(50)) 

insert into @table values (4, 1111, 'Test1') 
insert into @table values (6, 2222, 'Test2') 
insert into @table values (6, 3333, 'Test3') 
insert into @table values (7, 4444, 'Test4') 
insert into @table values (7, 5555, 'Test5') 
insert into @table values (7, 6666, 'Test6') 

SELECT 
    *, 
    DENSE_RANK() OVER (ORDER BY [TxnNmbr]) AS [Unique Txn] 
FROM @table 
+0

这将不会“重新启动”每个txn_number的编号,因为分区by缺失。 –

+0

@a_horse_with_no_name:非常感谢你的脚本。然而正如你所说的,它会重新启动每个txn nmbr的数量。我怎样才能避免这种情况?请帮忙! – user1839815

+0

@ user1839815我没有找到你,请检查编辑后的答案。 – TechDo

0

查询:

SQLFiddleExample

SELECT 
t1.*, 
(SELECT COUNT(*) 
FROM tbl t2 
WHERE t1.[Txn Nmbr] = t2.[Txn Nmbr]) as [Unique Txn] 
FROM tbl t1 

结果:

| TXN NMBR | ITEM ID | DESC | UNIQUE TXN | 
-------------------------------------------- 
|  4 | 1111 | Test 1 |   1 | 
|  6 | 2222 | Test 2 |   2 | 
|  6 | 3333 | Test 3 |   2 | 
|  7 | 4444 | Test 4 |   3 | 
|  7 | 5555 | Test 5 |   3 | 
|  7 | 6666 | Test 6 |   3 |