Как мне преобразовать столбец таблицы данных из совокупного в разностный при чтении CSV в приложение весенней загрузки? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть данные в таблице, например

   date  | city | Cumulative total 
---------------------------------
1/1/2020 | NYC  |    10
1/2/2020 | NYC  |    15
1/3/2020 | NYC  |    31
1/4/2020 | NYC  |    36
1/5/2020 | NYC  |    55
 .
 .  // more data for NYC continued
 .
1/1/2020 | BER  |    1
1/2/2020 | BER  |    5
1/3/2020 | BER  |    13
1/4/2020 | BER  |    42
1/5/2020 | BER  |    45
 .
 .  // more data for BER continued
 .

Я хочу, чтобы эти данные не содержали cumulative, а содержали difference. В основном я хочу вычесть следующий день из предыдущего дня, убедившись, что города совпадают.

   date  | city | Cumulative total 
---------------------------------
1/1/2020 | NYC  |    10
1/2/2020 | NYC  |    5
1/3/2020 | NYC  |    16
1/4/2020 | NYC  |    5
1/5/2020 | NYC  |    19
 .
 .  // more data for NYC continued
 .
1/1/2020 | BER  |    1
1/2/2020 | BER  |    4
1/3/2020 | BER  |    8
1/4/2020 | BER  |    29
1/5/2020 | BER  |    3
 .
 .  // more data for BER continued
 .

У меня есть данные в CSV, и я загружаю их в базу данных для весенней загрузки применение. Однако приложению с весенней загрузкой нужна разница, а не совокупность. Как я могу правильно преобразовать эти данные в

  1. в базе данных при чтении данных из CSV?

  2. Путем написания специального запроса в JpaRepository, чтобы мои POJO возвращались в виде преобразованных данных?

Я не знаю, как реализовать любой из предыдущих, но это мои идеи о том, что делать. Я прошу кого-нибудь помочь мне понять, какой способ справиться с этой ситуацией является наиболее «стандартным в отрасли». Может быть, есть способ лучше, чем я предлагал.

Спасибо!

1 Ответ

1 голос
/ 29 мая 2020

Если ваша база данных поддерживает оконные функции, это простая задача для lag(), которая позволяет вам получить доступ к любому столбцу в предыдущей строке с учетом спецификации partition и order by:

select 
    t.*,
    cumulative 
        - lag(cumulative, 1, 0) over(partition by city order by date) as difference
from mytable t

Не все базы данных поддерживают форму с тремя аргументами lag(), и в этом случае вы можете сделать:

select
    t.*,
    coalesce(
        cumulative - lag(cumulative) over(partition by city order by date),
        cumulative
    ) difference
from mytable t
...