如何在循环中将结果导出到 CSV

Posted

技术标签:

【中文标题】如何在循环中将结果导出到 CSV【英文标题】:how to export results to CSV in a loop 【发布时间】:2016-12-29 13:17:18 【问题描述】:

我有一个 SQL 查询

       select time,t_count,sum(t_count) over (order by time) as
       cumulative_t_count ,cumulative_t_count/sum(t_count) as percentage_cumulative count,state,hour from (select distinct
       time,count(distinct num_id) as t_count,state,hour from (select * from
       public.table1 where day=1 and time>0 order by time)as A group by
       time,hour,state order by hour,state )B where state=1 and hour=1; 

这给了我以下格式的结果:

time  t_count  cumulative_t_count  state  hour
_____ _____  _________________     ____  ____
1      10          10               1    1
2      20          30               1    1
3      30          60               1    1
4      60          120              1    1

同样,我有 80 个状态和 0-23 小时。我想通过将状态从 1-80 更改为 1、7、14、19 小时,将所有结果导出到 CSV 文件。所以现在我手动更改上述代码中的状态和时间并将结果导出为 CSV。但似乎我必须将状态 1 更改为 80 和每个状态的 1、7、14、19 小时。

BEGIN
FOR i IN 1..80 LOOP


  FOR i IN 1,7,14,19 LOOP
      /copy ( select time,t_count,sum(t_count) over (order by time) as
       cumulative_t_count ,cumulative_t_count/sum(t_count) as     percentage_cumulative count,state,hour from (select distinct
       time,count(distinct num_id) as t_count,state,hour from (select * from
       public.table1 where day=1 and time>0 order by time)as A group by
       time,hour,state order by hour,state )B where state=i and hour=j)

     To '/tmp/state_i_hour_j.csv' With CSV
 END LOOP

END LOOP

但这不起作用。我还想以 CSV 格式导出每个结果集。感谢任何帮助。

【问题讨论】:

\copypsql 唯一的命令,不是 SQL 语句 - 这就是你在 list of SQL commands 中找不到它的原因 - 你不能使用PL/pgSQL 函数中的那个 感谢您的解释,但复制命令将不起作用,因为我不是超级用户。那么如何将循环中的文件导出为 CSV 【参考方案1】:

如果您只需要这样做一次,您可以使用以下创建您需要的 sql 语句。然后您可以复制输出记录并执行它们。

WITH states AS
(SELECT generate_series(1,80) as i),
hours AS
(SELECT j FROM (values (1),(14),(17),(19) ) s(j))
SELECT 'copy ( select time,t_count,sum(t_count) over (order by time) as
       cumulative_t_count ,cumulative_t_count/sum(t_count) as     percentage_cumulative count,state,hour from (select distinct
       time,count(distinct num_id) as t_count,state,hour from (select * from
       public.table1 where day=1 and time>0 order by time)as A group by
       time,hour,state order by hour,state )B where state=' ||i || ' and hour=' ||j || ')

     To ''/tmp/state_' ||i || '_hour_' ||j || '.csv'' With CSV;' from states,hours

【讨论】:

此 SQL 查询在表 320 行中提供以下 copy ( select time,t_count,sum(t_count) over (order by time),但在目标中未生成 CSV 查询所做的只是创建您需要的查询语句。然后你需要执行它们,例如通过在 PGadmin 中复制和粘贴它们。

以上是关于如何在循环中将结果导出到 CSV的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将查询结果导出到 .csv 文件

如何在 for 循环中将结果写入多个 CSV 文件

如何:在 MySQL 工作台中将记录集导出为分号分隔的 csv 文件?

如何在 Angular 中将动态 JSON 对象数组导出为 CSV?

在 Julia 中将数组导出到 CSV 文件

在 Rails 中将 2 个表导出为 CSV [如何选择特定列?]