Как получить предыдущее значение в инструкции SQL Server SELECT - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть такая таблица

Я хочу добавить столбец с именем " Сумма вчера ", гдезначение равно сумме с предыдущей даты и той же учетной записи.Например, в ACCOUNT_NO = 1, где дата 24 марта 2014 г., Вчера Сумма имеет значение 100. Есть ли решение для этой проблемы?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Не проверено

select Table.ACCOUNT_NO, Table.Date, Table.Amount,
    Table2.Amount Yesterday_Amount
from Table
left outer join Table as Table2
   on Table.ACCOUNT_NO = Table2.ACCOUNT_NO
   and Table.Date = dateadd("dd",1,Table2.Date)

Присоедините таблицу к себе при условии, что ACCOUNT_NO равен, а дата на единицу меньше.Использование внешнего левого соединения оставит значение Yesterday_Amount, если предыдущее значение отсутствует.Замените его на isnull (Yesterday_Amount, 0), если вы хотите, чтобы сумма была равна нулю.

1 голос
/ 24 сентября 2019

Обновление

Как указывает @BenThul, LAG имеет необязательное значение по умолчанию, которое можно использовать для устранения необходимости использования COALESCE:

SELECT ACCOUNT_NO,
       [Date],
       Amount,
       LAG(Amount, 1, 0) OVER(PARTITION BY ACCOUNT_NO ORDER BY [Date]) AS "Yesterday Amount"
FROM test

Демонстрация на dbfiddle

Оригинальный ответ

Вы можете просто использовать LAG, с COALESCE, чтобы превратить NULL значенияв 0 (если значения предыдущего дня не существует):

SELECT ACCOUNT_NO,
       [Date],
       Amount,
       COALESCE(LAG(Amount) OVER(PARTITION BY ACCOUNT_NO ORDER BY [Date]), 0) AS "Yesterday Amount"
FROM test

Вывод:

ACCOUNT_NO  Date                    Amount  Yesterday Amount
1           23/03/2014 00:00:00     100     0
1           24/03/2014 00:00:00     200     100
1           25/03/2014 00:00:00     50      200
2           23/03/2014 00:00:00     1111    0
3           24/03/2014 00:00:00     1200    0
3           25/03/2014 00:00:00     1300    1200
1 голос
/ 24 сентября 2019

Вот ваш запрос.если не вчерашняя дата, сумма будет равна 0, поэтому будет отображаться только сумма на основе вчерашней даты за account_no

select t.*
    , case when dateadd(day, 1, cast(t.[date] as date)) =  cast(t.[date2] as date) then t2.Amount else 0 end as Yesterday_Amount 
from (
    select t1.*, t2.date as date2
    from 
        (select acccount_no, row_number() over (partition by account_no order by date asc) rn, amount from tableA) t1
    left join
        (select acccount_no, row_number() over (partition by account_no order by date asc) rn, amount from tableA) t2 
            on t2.rn + 1 = t1.rn and t2.account_no = t1.account_no) as t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...