2015-01-27 2 views
0

У меня есть таблица, называемая транзакциями. Я хочу иметь возможность измерять дни между cmnt_cre_dates.вычисление разницы между двумя датами в той же колонке

таблица выглядит следующим образом

pt_id name    trans_cmnt pt_loc last_bl_date cmnt_cre_date 
94578 RAMIREZ , JOHN Trans 130  S  1/8/2015  1/8/2015 
94578 RAMIREZ , JOHN Trans 146  S  1/8/2015  1/9/2015 
94578 RAMIREZ , JOHN Trans 380  S  1/8/2015  1/13/2015 
94578 RAMIREZ , JOHN Trans 344  S  1/8/2015  1/15/2015 
54678 KIFLE ,LOLA  Trans 146  S  1/16/2015 1/16/2015 
54678 KIFLE ,LOLA  Trans 230  S  1/16/2015 1/16/2015 
12547 WEISS ,Jenny  Trans 230  S  1/26/2015 1/26/2015 
12711 FARRELL ,DIVINA Trans 230  S  1/14/2015 1/14/2015 
12711 JOHNS ,NATIVIDAD Trans 230  S  1/23/2015 1/13/2015 
12711 JOHNS ,NATIVIDAD Trans 230  S  1/23/2015 1/23/2015 

Я хотел бы, чтобы таблица выглядит следующим образом:

pt_id name    trans_cmnt pt_loc last_bl_date cmnt_cre_date diff_days 
94578 RAMIREZ , JOHN Trans 130 S  1/8/2015  1/8/2015   0 
94578 RAMIREZ , JOHN Trans 146 S  1/8/2015  1/9/2015   1 
94578 RAMIREZ , JOHN Trans 380 S  1/8/2015  1/13/2015  4 
94578 RAMIREZ , JOHN Trans 344 S  1/8/2015  1/15/2015  2 
54678 KIFLE ,LOLA  Trans 146 S  1/16/2015 1/16/2015  0 
54678 KIFLE ,LOLA  Trans 230 S  1/16/2015 1/16/2015  0 
12547 WEISS ,Jenny  Trans 230 S  1/26/2015 1/26/2015  0 
12711 FARRELL ,DIVINA Trans 230 S  1/14/2015 1/14/2015  0 
12711 JOHNS ,NATIVIDAD Trans 230 S  1/23/2015 1/13/2015  0 
12711 JOHNS ,NATIVIDAD Trans 230 S  1/23/2015 1/23/2015  10 

Как это сделать в SQL Server?

+0

Какую базу вы используете? –

ответ

0

Если я вас правильно понял ...

update your_table current set diff_days = 
cmnt_cre_date - (select max(cmnt_cre_date) from your_table 
        where cmnt_cre_date < current.cmnt_cre_date 
        and name = current.name) ; 

update your_table set diff_days = 0 where diff_days is null; 

выше в Postgres, так как вы не указали, какую базу данных вы используете.

+0

sql server 2008 – user3814197

+0

Я не знаком с postgres – user3814197

0

Вы можете работать по

SELECT 
    T.pt_id 
    , T.name 
    , T.trans_cmnt 
    , T.pt_loc 
    , T.last_bl_date 
    , T.cmnt_cre_date 
    , ISNULL(DATEDIFF(day, 
        (SELECT MAX(cmnt_cre_date) 
        FROM Transactions 
        WHERE name = T.name AND cmnt_cre_date < T.cmnt_cre_date), 
        cmnt_cre_date), 
      0) diff_days 
FROM Transactions T 
; 

Пожалуйста, помните: Вы не можете полагаться на записи, которые будут возвращены в каком-то определенном порядке, если вы не обеспечивают ORDER BY положение.

Прокомментируйте, если и как требуется дополнительная настройка/дальнейшая информация.

Смежные вопросы