繁体   English   中英

为包含大量数据的表生成CSV

[英]Generate CSV for table with a lot of data

我在postgres数据库中有一个表(实际上是AWS Redshift),经过一些操作后,该表中的数据需要导出到CSV。 例如,考虑一个具有列A,B,C,D的表Test。

Column A, Column B, Column C, Column D
ValueA1 , ValueB1 , ValueC1 , 1
ValueA1 , ValueB2 , ValueC2 , 2     

其中A,B,C是字符串,D是整数。

该表中的条目表示对于A列,B列,C列,D列的值是计数。

A,B,C之间的关系是等级A> B>C。

我的要求是CSV必须具有与postgres汇总操作相对应的数据。 即CSV范例:

Column A, Column B, Column C, Sum(D)
ValueA1 ,         ,         ,  3
        , ValueB1  ,         , 1
        ,         , ValueC1 ,  1 
        , ValueB2  ,         , 2
        ,         , ValueC2 ,  2

当前,我的方法是对A,B,C进行分组,并获得D列的总和。在应用程序中正在进行分层聚合。 我无法一次性获得全部结果(7000万左右),但是如果我使用postgres中的limit和offset来以分页的方式获取数据,那么我最终可能会拆分分层数据,从而导致ValueA在CSV中两次(或多次)被看到。

应用程序是使用Java和JOOQ构建的。 数据发送到前端(使用react构建),并在其中写入CSV。

感谢您提供有关如何完成此CSV的任何帮助。

如果我理解正确,那么您希望确保每次发送数据块时,该数据块必须包含列A的任何给定值(存在于该数据块中)的所有行。 您可以使用DENSE_RANK函数,如下所示-

SELECT *
FROM (
       SELECT
         ColumnA,
         ColumnB,
         ColumnC,
         dense_rank()
         OVER (
           ORDER BY ColumnA ASC ) AS dr,
         sum(ColumnD)             AS sumD
       FROM SomeTable
       GROUP BY ColumnA,
         ColumnB,
         ColumnC) AS sub_table
WHERE sub_table.dr BETWEEN 1 AND 5

在最后一种情况下,您可以在块中提供所需的记录编号范围(每当ColumnA的值更改时,density_rank()都会增加)

您可以参考-https : //docs.aws.amazon.com/redshift/latest/dg/r_WF_DENSE_RANK.html https://docs.aws.amazon.com/redshift/latest/dg/r_Examples_of_dense_rank_WF.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM