2014-01-08 84 views
0

我使用的是SQL Server 2005的查询,这是我的查询:删除多笔交易,并保持第一交易

select Transaction_Nr, Serial_Nr, Qty 

    from TRANSACTION_TABLE 

,我有一个这样的输出:

Transaction_Nr | Serial_Nr | Qty 
    ------------------------------------------- 
     40001   | 25001 | 2000 
     40002   | 25002 | 1500 
     40003   | 25003 | 2700 
     40004   | 25001 | 1500 
     40005   | 25002 | 1000 
     40006   | 25008 | 3000 

那么如何我可以通过多次交易获得Serial_Nr的第一个transaction_Nr,并且输出应该是这样的:

Transaction_Nr | Serial_Nr | Qty 
    ------------------------------------------- 
     40001   | 25001 | 2000 
     40002   | 25002 | 1500 
     40003   | 25003 | 2700 
     40006   | 25008 | 3000 

谢谢,

+0

请给出详细就像根据你要过滤你的数量想要的多transaction.Do什么? –

+0

这只是为了查询,还是想要实际更改表中的数据?而且我们没有对具有后续交易号码的行中的数据做任何更正,对吗? (除了完全丢弃它) –

回答

2

您可以使用ROW_NUMBER()分配适当的订购信息:

; With Ordered as (
    select Transaction_Nr,Serial_Nr,Qty, 
      ROW_NUMBER() OVER (PARTITION BY Serial_Nr 
           ORDER BY Transaction_Nr) as rn 
    from TRANSACTION_TABLE 
) 
select Transaction_Nr,Serial_Nr,Qty 
from Ordered 
where rn = 1 
+0

谢谢你..这个作品!^_^.. – Captain16

+1

谁批准了这个编辑...它比以前更不可读 – Doomsknight

0

你写So how can I get我interpretted意味着select

做一个group by "Serial_Nr"以获得每个Serial_Nr第一Transaction_Nr。 然后将这些“第一个序列号”重新加入到您的表格中以获取所需的行。

SELECT y.* 
FROM (
     SELECT MIN("Transaction_Nr") AS "Transaction_Nr" 
     FROM "TRANSACTION_TABLE" 
     GROUP BY "Serial_Nr" 
    ) x 
INNER JOIN "TRANSACTION_TABLE" y ON y."Transaction_Nr" = x."Transaction_Nr" 
ORDER BY y."Transaction_Nr"; 

编辑: @Damien_The_Unbeliever基本上做同样的事情,但使用的CTE(公共表表达式),而不是自联接。


在另一方面,如果你的意思是,你的查询后,表应该只包含第一行(根据序列号,即:删除非第一行):

DELETE FROM "TRANSACTION_TABLE" 
USING (
      SELECT "Serial_Nr" AS "ser", 
       MIN("Transaction_Nr") AS "trn" 
      FROM "TRANSACTION_TABLE" 
      GROUP BY "Serial_Nr" 
    ) x 
WHERE "Serial_Nr" = x.ser 
AND "Transaction_Nr" != x.trn;