Как рассчитать разницу между текущей датой и предыдущей датой в разных строках

Привет, я хочу рассчитать разницу между датами в разных строках с помощью помощника sql teradata.

мой стол выглядит так

create table test (
    id INT,
    Dx varchar(10)
    Dx_date date);

    insert into TEST values(1,'E14','2015-05-03');
insert into TEST values(1,'E15','2013-05-06');
insert into TEST values(1,'E15','2016-03-03');
insert into TEST values(2,'E15','2012-03-04');
insert into TEST values (3,'E144','2011-03-04');
insert into TEST values  (3,'E122','2011-02-04');

Чем рассчитать разницу дат между каждой строкой, я использую этот код

select id,
            dx, 
            Date_dx, 
            zeroifnull (MDIFF(Date_dx,1,id,dx)
            from TEST
            group by id;

Но это дало мне неправильные результаты

Спасибо вам за помощь


person Houssem Missaoui    schedule 18.05.2018    source источник


Ответы (3)


Оконная функция должна облегчить это.

Для разницы дат в днях:

  Select *
 ,DateDiff(DD, Dx_date, Lag(Dx_Date) Over (Order By Dx_date)) DateDiff
 From test

Хотя вы не указали, ваша попытка рассчитать дату предполагает, что вас многие интересуют расчеты дат по идентификатору, поэтому;

Select  *
        ,DateDiff(DD, Dx_date, Lag(Dx_Date) Over (Partition by id Order By Dx_date)) DateDiff
From test

Примечание. вам может потребоваться отредактировать функцию даты соответствующим образом.

person Tolu    schedule 18.05.2018
comment
Код не работает. Я получаю сообщение об ошибке. Тип данных Dx_date не соответствует имени определенного типа. - person Houssem Missaoui; 21.05.2018
comment
См. Примечание в моем ответе. - person Tolu; 21.05.2018

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

 select id, dx, datediff(day, lastdate, date_dx) datedifference from (
    select id,
                dx, 
                Date_dx, 
                lag(Date_dx,1,null) over(order by id)lastdate
                from TEST)A
person Daniel Marcus    schedule 18.05.2018
comment
Код не работает, и я не думаю, что функции datediff и lag не существуют в Teradata Sql – - person Houssem Missaoui; 21.05.2018

я нашел решение

select id ,dx,Dx_date,
       zeroifnull(dx_date-min(dx_date) over (partition by id order by dx_date rows 
       between 1 preceding and 1 preceding )) as difference _dx_date
from TEST;

Спасибо

person Houssem Missaoui    schedule 21.05.2018