将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?
Posted
技术标签:
【中文标题】将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?【英文标题】:How do I transform a data table column from cumulative to difference when reading CSV into spring boot application? 【发布时间】:2020-05-28 23:44:00 【问题描述】:我的表格中有数据
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 中的数据,我将其加载到数据库中以用于 Spring Boot 应用程序。但是,spring boot 应用需要的是差异,而不是累积。我怎样才能正确地转换这些数据呢
从 CSV 读取数据后在数据库内?
通过在 JpaRepository
中编写一个特殊查询,以便我的 POJO 作为转换后的数据返回?
我不知道如何实现前面的任何一个,但它们是我的想法。我要求有人帮我看看处理这种情况的最“行业标准”的方法是什么。也许有比我提出的更好的方法。
谢谢!
【问题讨论】:
【参考方案1】:如果您的数据库支持窗口函数,这对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
【讨论】:
以上是关于将 CSV 读入 Spring Boot 应用程序时,如何将数据表列从累积转换为差异?的主要内容,如果未能解决你的问题,请参考以下文章