[英]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.