AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 332921
Accepted
SpiderMan
SpiderMan
Asked: 2023-11-09 14:50:06 +0800 CST2023-11-09 14:50:06 +0800 CST 2023-11-09 14:50:06 +0800 CST

Crosstab de múltiplas colunas no postgresql

  • 772

Estou tentando combinar duas crosstab no postgres, mas travou, será ótimo se alguém me orientar.

-- rainfall CROSS TAB
SELECT * FROM
CROSSTAB(
'SELECT block_id, forecast_date, rainfall_mm
 FROM weather.imd_forecast 
    ORDER BY 1'
)
AS rainfall_crosstab(
    block_id int, rainfall_day_1 numeric, rainfall_day_2 numeric, 
    rainfall_day_3 numeric, rainfall_day_4 numeric, rainfall_day_5 numeric
);
    
-- temp_max CROSS TAB
SELECT * FROM
CROSSTAB(
'SELECT block_id, forecast_date, temp_max_deg_c 
 FROM weather.imd_forecast 
    ORDER BY 1'
)
AS temp_max_crosstab(
    block_id int, temp_max_day_1 numeric, temp_max_day_2 numeric, 
    temp_max_day_3 numeric, temp_max_day_4 numeric, temp_max_day_5 numeric);

insira a descrição da imagem aqui

postgresql
  • 2 2 respostas
  • 29 Views

2 respostas

  • Voted
  1. user3402754
    2023-11-09T16:49:30+08:002023-11-09T16:49:30+08:00

    Supondo que block_id e Forecast_date sejam campos comuns em ambos os resultados da tabela cruzada, você pode usar uma joinoperação para combiná-los com base nesses campos. Com base nessa suposição, primeiro, podemos usar expressões de tabela comuns (CTEs) para criar conjuntos de resultados temporários para rain_crosstab e temp_max_crosstab. Em seguida, realizamos uma operação JOIN nos campos block_ide forecast_datepara combinar os dois resultados da tabela cruzada.

    WITH rainfall_crosstab AS (
        SELECT *
        FROM CROSSTAB(
            'SELECT block_id, forecast_date, rainfall_mm
             FROM weather.imd_forecast 
             ORDER BY 1'
        ) AS rainfall_crosstab(
            block_id int, rainfall_day_1 numeric, rainfall_day_2 numeric, 
            rainfall_day_3 numeric, rainfall_day_4 numeric, rainfall_day_5 numeric
        )
    ), temp_max_crosstab AS (
        SELECT *
        FROM CROSSTAB(
            'SELECT block_id, forecast_date, temp_max_deg_c 
             FROM weather.imd_forecast 
             ORDER BY 1'
        ) AS temp_max_crosstab(
            block_id int, temp_max_day_1 numeric, temp_max_day_2 numeric, 
            temp_max_day_3 numeric, temp_max_day_4 numeric, temp_max_day_5 numeric
        )
    )
    SELECT 
        rc.block_id, 
        rc.rainfall_day_1, rc.rainfall_day_2, rc.rainfall_day_3, 
        rc.rainfall_day_4, rc.rainfall_day_5,
        tc.temp_max_day_1, tc.temp_max_day_2, tc.temp_max_day_3, 
        tc.temp_max_day_4, tc.temp_max_day_5
    FROM rainfall_crosstab rc
    JOIN temp_max_crosstab tc ON rc.block_id = tc.block_id AND rc.forecast_date = tc.forecast_date;
    
    • 0
  2. Best Answer
    Erwin Brandstetter
    2023-11-09T17:57:51+08:002023-11-09T17:57:51+08:00

    Ambas as suas consultas exigem ORDER BY 1, 2, não apenas ORDER BY 1. Caso contrário, o resultado pode estar errado. Veja a demonstração no violino.

    Solução combinada:

    SELECT block_id
         , (t1).rainfall_mm AS rainfall_day1, (t1).temp_max_deg_c AS temp_day1
         , (t2).rainfall_mm AS rainfall_day2, (t2).temp_max_deg_c AS temp_day2
         , (t3).rainfall_mm AS rainfall_day3, (t3).temp_max_deg_c AS temp_day3
         , (t4).rainfall_mm AS rainfall_day4, (t4).temp_max_deg_c AS temp_day4
         , (t5).rainfall_mm AS rainfall_day5, (t5).temp_max_deg_c AS temp_day5
    FROM   crosstab(
       'SELECT block_id, forecast_date, t
        FROM   weather.imd_forecast t
        ORDER  BY 1, 2'
        ) AS ct (   block_id int, t1 imd_forecast, t2 imd_forecast
               , t3 imd_forecast, t4 imd_forecast, t5 imd_forecast);
    

    violino

    Leia aqui:

    • Consulta de tabela cruzada PostgreSQL
    • Tabela dinâmica com múltiplas colunas de valores
    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve