将 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() 来说是一项简单的任务,它允许您访问上一个 行中的任何列,给定partitionorder 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 应用程序时,如何将数据表列从累积转换为差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 将 CSV 文件导入 MYSQL

Spring Boot 读取用户上传的 csv 文件

如何在 Spring Boot 中将属性文件值读入字符串集

Spring Boot下的一种导出CSV文件的代码框架

将特定行的csv读入php

Docker 容器中的 Spring Boot 资源