Оставил Присоединиться, но использовать запись только один раз - PullRequest
2 голосов
/ 29 апреля 2020

Вот и моя проблема. У меня есть таблица транзакций, где мы храним все транзакции для всех учетных записей (огромные таблицы-153M строк). Отрицательная транзакция может компенсировать положительную транзакцию, если их код смещения совпадает.

Проблема состоит в том, что один отрицательный транс может компенсировать только самый старый положительный транс с тем же кодом смещения. Единственный способ, о котором я могу думать, - это l oop через все отрицательные транзакции и начать вставлять соответствующие положительные в временную таблицу. Затем присоедините временную таблицу в l oop, чтобы избежать дублирования.

Я не думаю, что было бы хорошей идеей запустить al oop в такой большой таблице, но я не могу придумать какой-либо другой элегантный способ достичь того, чего я хочу.

Это сложно объяснить, поэтому ниже приведена упрощенная таблица.

DROP TABLE IF EXISTS #TBL
CREATE TABLE #TBL
(TranID TinyInt, TranDT Date, OffsetCode CHAR(1), NegTran Bit)
INSERT #TBL VALUES
(1,'4/1/2020','A',0)
,(2,'4/2/2020','A',0)
,(3,'4/3/2020','A',0)
,(4,'4/4/2020','B',0)
,(5,'4/5/2020','B',0)
,(6,'4/6/2020','B',0)
,(7,'4/7/2020','B',1)
,(8,'4/8/2020','B',1)
,(9,'4/9/2020','A',1)
,(10,'4/10/2020','A',1)

В конце концов, то, что я хочу увидеть, находится ниже

TranID  TranDT      OffsetCode   NegTran   TranID TranDT      OffsetCode NegTran
7       2020-04-07  B            1         4      2020-04-04  B          0
8       2020-04-08  B            1         5      2020-04-05  B          0
9       2020-04-09  A            1         1      2020-04-01  A          0
10      2020-04-10  A            1         2      2020-04-02  A          0

Может кто-нибудь пожалуйста помочь мне с этим?

1 Ответ

2 голосов
/ 29 апреля 2020

Я думаю, вы можете сделать это, используя row_number() и либо условную агрегацию, либо join.

select max(case when negtran = 1 then tranid end),
       max(case when negtran = 1 then trandt end),
       offsetcode, 
       max(case when negtran = 1 then 1 else 0 end),
       max(case when negtran = 0 then tranid end),
       max(case when negtran = 0 then trandt end),
       offsetcode, 
       max(case when negtran = 0 then 1 else 0 end)
from (select t.*,
             row_number() over (partition by negtran, offsetcode order by trandt) as seqnum
      from t
     ) t
group by offsetcode, seqnum
...