在Postgres中使用generate_series和交叉表时,返回“记录”的函数需要列定义列表

时间:2019-12-12 10:28:57

标签: sql postgresql crosstab execute generate-series

我在postgres中有此代码,我尝试获取一段时间内行的计数(以几周为间隔),然后每周在列中进行转换。

  1. 我使用循环来生成var str中一段时间​​内的星期,我使用generate_series。
  2. 我准备使用交叉表查询来转换列中的行。
  3. 我执行查询,但遇到下一个错误
DO $$
DECLARE rec record;
DECLARE str text;
begin

str := '"estado" text,';

   FOR rec IN SELECT generate_series('2019-01-28 18:00:43.738-06', '2019-12-06 18:00:43.738-06', interval '1 week') as start_time
    LOOP
    str :=  str || '"' || rec.start_time || '" int' ||',';
    END LOOP;
    str:= substring(str, 0, length(str));

prepare query as SELECT * FROM crosstab('WITH grid AS (
   SELECT start_time, lead(start_time, 1, ''infinity'') OVER (ORDER BY start_time) AS end_time
   FROM  (
      SELECT generate_series(''2019-01-28 18:00:43.738-06'', ''2019-12-06 18:00:43.738-06'', interval ''1 week'') AS start_time
      FROM   servicios
      ) sub
   ) SELECT su.estado,  count(e.creado) AS events,  g.start_time 
FROM   grid  g
LEFT   JOIN servicios e ON e.creado >= g.start_time AND e.creado <  g.end_time
inner join sucursales as su on e.fksucursal = su.pk
where e.borrado = false
group by su.estado ')AS final_result(str);

EXECUTE 'query';                           

end $$
  1. 我遇到下一个错误:
ERROR:  a column definition list is required for functions returning "record"
LINE 1: prepare query as SELECT * FROM crosstab('WITH grid AS (

我有下一个

start date|estado     | events | 
2019-01-28|Mexico City|     6  |    
2019-02-04|Mexico City|     4  |  
2019-02-11|Mexico City|     3  |   
2019-02-18|Mexico City|     5  |
2019-01-28|New York   |     4  | 
2019-02-04|New York   |     2  |
2019-02-11|New York   |     8  |
2019-02-18|New Yor    |     2  |

我需要下一个

estado     | 2019-01-28| 2019-02-04| 2019-02-11| 2019-02-18| ..... 
Mexico City|   6       |     4     |    3       |   5      | ..... 
New York   |   4       |     2     |    8       |   2      | ..... 
Moscu      |   5       |     9     |    6       |   1      | .....  

0 个答案:

没有答案