簡體   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