2014-01-08 3 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 

Так как могу ли я получить только первый transaction_Nr для Serial_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, которые я имею в виду, чтобы интерпретируются с select:

Сделайте group by "Serial_Nr", чтобы получить первый Transaction_Nr для каждого Serial_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 сделал в основном то же самое, но использовали КТР (общее выражение таблицы), а не автообъединение.


С другой стороны, если вы имеете в виду, что после вашего запроса, таблица должна содержать только первую строку (на основе серийного номера, т.е. удалить без первых строк):

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; 
Смежные вопросы