Обновление записей таблицы устанавливает поле как добавление полей в две строки условно - PullRequest
0 голосов
/ 06 июня 2019

Имя таблицы: TraderCapital

Столбцы:

Trader (varchar),   
Currency(varchar),   
Date(int i.e. yyyymmdd format),    
Capital(int)  

поля первичного ключа: трейдер, валюта

Trader, Currency, Date, Capital  
A, USD, 20190605, 100  
A, USD, 20190606, 100  
B, INR, 20190605, 200   
B, INR, 20190606, 200   
C, USD, 20190606, 100  
D, USD, 20190601, 100    

Я хочу обновить свою таблицу после агрегирования Capital of20190606 к столице 20190605. Таким образом, желаемый результат должен выглядеть следующим образом:

Trader, Currency, Date, Capital  
A, USD, 20190605, 200  
B, INR, 20190605, 400  
C, USD, 20190606, 100 
D, USD, 20190601, 100  

Не могли бы вы помочь мне написать SQL-запрос для того же?

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Попробуйте оконные функции, такие как:

select b.Trader,b.Currency, b.Date, b.running_total as Capital 
from (
select a.Trader,a.Currency, a.Date, a.running_total
, row_number() over (partition by a.Trader, a.Currency order by a.running_total desc) rnk
from (
select * ,sum(capital) over (partition by Trader, Currency order by Date desc) as running_total
from TraderCapital )a )b
where b.rnk = 1

Результат теста:

Dd <> Fiddle

1 голос
/ 06 июня 2019

Вы можете достичь этого, используя LAG().На первом этапе я создал столбец, который проверяет, есть ли предыдущий день для строки.Позже я использовал этот столбец (previousDay) для группировки строк.

with previousDay as (
    select
        *
        ,LAG(date) over (partition by trader, currency order by date asc) as PreviousDay
    from TraderCapital
)
select
     trader
    ,currency
    ,case when PreviousDay is not null then dateadd(day, -1, date) else date end as date
    ,sum(Capital) as capital
from previousDay 
group by case when PreviousDay is not null then dateadd(day, -1, date) else date end
    ,trader
    ,currency
0 голосов
/ 08 июня 2019

Спасибо @M.Kanarkowski и @Gen Wan за ваши ответы.Вот что сработало, наконец, для меня, основываясь на ваших предложениях:

with PreviousDayTable as (  
select *, LAG(Date) over (partition by Trader, Currency order by Date) 
          as previousDay
from TraderCapital
),
TotalTable as (
select Trader, Currency, 
       case when previousDay is not null then previousDay else Date end as PreviousDay,
       sum(Capital) as agg
  from PreviousDayTable 
  group by Trader, Currency,
           case when previousDay is not null then previousDay else Date end
)
update TraderCapital 
set TraderCapital.Capital = B.agg
from TraderCapital as A JOIN TotalTable as B
ON A.Trader = B.Trader
AND A.Currency = B.Currency
AND A.Date = B.previousDay


with PreviousDayTable as (
select *, LAG(Date) over (partition by Trader, Currency order by Date) 
          as previousDay
from TraderCapital
)
delete A
from TraderCapital as A JOIN PreviousDayTable as B
ON A.Trader = B.Trader
AND A.Currency = B.Currency
AND A.Date = B.Date
where B.previousDay is not null

Не стесняйтесь предлагать улучшения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...