Цикл SQL записей сервера с GROUP BY для обновления значения для группы - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть таблица CustomerSales, которая выглядит следующим образом:

[RowID], [Cust], [Time], [Article], [Qty], [Amount], [Receipt]
1, C1, 10:10:00, A1, 1, 100, 1
2, C1, 10:10:00, A2, 2, 101, 1
3, C1, 10:10:00, A3, 3, 102, 1 
4, C1, 10:10:00, A4, 4, 103, 1
5, C2, 10:10:11, A3, 5, 104, 1
6, C3, 10:20:01, A2, 6, 105, 1
7, C4, 10:20:01, A2, 7, 106, 1
8, C4, 10:20:01, A1, 8, 107, 1
9, C1, 11:11:01, A2, 3, 100, 1
10, C1, 11:11:01, A3, 2, 101, 1

CustomerSales table

У моих данных нет номера квитанции. Следовательно, требование состоит в том, чтобы генерировать линейное число для номера квитанции. например, начать с 1 и увеличить на 1. Чтобы определить, какие позиции принадлежат данному номеру квитанции, записи можно сгруппировать по [Cust] и [Time]. Все строки, принадлежащие группе [Cust] и [Time], будут обновлены с MAX (квитанция] +1 (следующий доступный номер квитанции).

Ожидаемые результаты, как показано ниже:

[RowID], [Cust], [Time], [Article], [Qty], [Amount], [Receipt]
1, C1, 10:10:00, A1, 1, 100, 1, 1
2, C1, 10:10:00, A2, 2, 101, 1, 1
3, C1, 10:10:00, A3, 3, 102, 1, 1 
4, C1, 10:10:00, A4, 4, 103, 1, 1
5, C2, 10:10:11, A3, 5, 104, 1, 2
6, C3, 10:20:01, A2, 6, 105, 1, 3
7, C4, 10:20:01, A2, 7, 106, 1, 4
8, C4, 10:20:01, A1, 8, 107, 1, 4
9, C1, 11:11:01, A2, 3, 100, 1, 5
10, C1, 11:11:01, A3, 2, 101, 1, 5

Expected Results

1 Ответ

3 голосов
/ 13 февраля 2020

Вы можете использовать dense_rank():

select t.*,
       dense_rank() over (order by time, cust) as receipt
from t;

Если вы хотите обновить данные, используйте обновляемый CTE:

with toupdate as (
      select t.*,
             dense_rank() over (order by time, cust) as new_receipt
      from t
     )
update toupdate
    set receipt = new_receipt;
...