Вычесть предыдущее значение строки в текущую строку и упорядочить по дате - PullRequest
0 голосов
/ 20 января 2019

Данные в моей таблице приведены нижеЯ не могу использовать порядок по пункту, т.е. adate и acc_no

Ответы [ 5 ]

0 голосов
/ 21 января 2019

Попробуйте это:

    Select  *, CASE WHEN LAG(value) OVER(partition by acc_no order by adate) IS NULL THEN value
    ELSE value - LAG(value) OVER(partition by acc_no order by adate) END  result from TB_DailyStatement
0 голосов
/ 20 января 2019

Я думаю, вы на правильном пути.Вам нужно order by во внешнем запросе и исправить псевдонимы таблицы:

SELECT ds.id, ds.value, ds.acc_no, ds.adate, 
       (t.value - COALESCE(prev.value, 0)) AS result 
FROM TB_DailyStatementt ds OUTER APPLY 
    (SELECT TOP (1) ds2.value
     FROM TB_DailyStatement ds2
     WHERE ds2.id < ds.t.id AND ds2.acc_no = ds.acc_no
     ORDER by ds2.id DESC
    ) prev
ORDER BY ds.acc_no, ds.adate
0 голосов
/ 20 января 2019

В SQL Server 2008 вы не можете использовать LEAD & LAG, для этого вы можете использовать запрос, подобный следующему, используя OUTER APPLY.

select * 
from  TB_DailyStatementt tout 
       outer apply (select top 1 value Prev 
                    from   TB_DailyStatementt t1 
                    where  t1.acc_no = tout.acc_no 
                           AND t1.adate < tout.adate 
                    order  by t1.adate desc)t1 
       outer apply (select top 1 value Next 
                    from   TB_DailyStatementt  t1 
                    where  t1.acc_no = tout.acc_no 
                           AND t1.adate > tout.adate 
                    order by t1.adate asc)t2 
       order by tout.adate,acc_no

Это даст вам необходимые предыдущие и следующие значения в зависимости отна acc_no.Теперь вы можете применить регистр переключателя для форматирования строки.

Проверьте это Демо

0 голосов
/ 20 января 2019
Declare @ds TABLE (id int, value int, acc_no int, dt datetime)
INSERT INTO @ds
SELECT  1, 12, 1, '2019-01-01 07:40:38.250' UNION
SELECT  2, 14, 1, '2019-01-02 07:41:05.883' UNION
SELECT  3, 15, 1, '2019-01-13 07:41:22.377' UNION
SELECT  4, 10, 2, '2019-01-14 08:15:53.403' UNION
SELECT  5, 16, 2, '2019-01-03 13:52:47.347' UNION
SELECT  6, 19, 1, '2019-01-09 13:53:56.317' UNION
SELECT  7,  7, 3, '2019-01-17 00:00:00.000' UNION
SELECT  8, 24, 2, '2019-01-17 00:00:00.000' UNION
SELECT  9, 19, 2, '2019-01-02 00:00:00.000' UNION
SELECT 10,  7, 1, '2019-01-07 00:00:00.000' UNION
SELECT 11, 24, 1, '2019-01-05 14:12:47.080' UNION
SELECT 12, 20, 3, '2019-01-28 00:00:00.000'

SELECT id, value, acc_no, dt, value - previous AS result
FROM (
  SELECT ROW_NUMBER() OVER (PARTITION BY DS1.id
                            ORDER BY     DS2.dt DESC) AS rn
  ,DS1.*, COALESCE(DS2.value,0) AS previous
  FROM      @ds DS1
  LEFT JOIN @ds DS2
    ON      DS2.acc_no = DS1.acc_no
    AND     DS2.dt     < DS1.dt
) AS dt
WHERE rn = 1

В исходном запросе вы присоединяетесь к ID, ваши комментарии в желаемых результатах показывают, что вы хотите использовать дату для заказа, а не идентификатор.

Таким образом, вы можете исправить исходный запрос, изменив «id

0 голосов
/ 20 января 2019

Если вы хотите получить этот результат, просто упорядочив по acc_no asc, вы можете получить просто ожидаемый результат,

Например,

Выбрать * из таблицы с помощью acc_no acs

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