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 / 307724
Accepted
IBot
IBot
Asked: 2022-02-20 06:36:03 +0800 CST2022-02-20 06:36:03 +0800 CST 2022-02-20 06:36:03 +0800 CST

Adicione uma nova linha para cada par de valores jsonb

  • 772

Eu tenho esta tabela de onde estou executando uma consulta:

CREATE TABLE IF NOT EXISTS public.preprocess_things
(
    preprocess_id integer NOT NULL DEFAULT nextval('preprocess_things_preprocess_id_seq'::regclass),
    arrive_date date NOT NULL,
    arrive_location character varying COLLATE pg_catalog."default" NOT NULL,
    data jsonb NOT NULL,
    CONSTRAINT preprocess_things_pkey PRIMARY KEY (preprocess_id),
    CONSTRAINT preprocess_things_arrive_date_arrive_location_bo_key UNIQUE (arrive_date, arrive_location)
)

A consulta que estou executando é esta:

SELECT DATE_TRUNC('month', arrive_date) AS grouped_date,
  LOWER(arrive_location) AS location,
  json_build_object(
    '1', SUM((data->'1')::int),
    '2', SUM((data->'2')::int),
    '3', SUM((data->'3')::int),
    '4', SUM((data->'4')::int),
    '5', SUM((data->'5')::int)
    ) AS data
FROM preprocess_things
GROUP BY grouped_date,
  location

O resultado atual é:

data_agrupada localização dados
01-06-2018 00:00:00 localização_00 {"1": 1, "2": nulo, "3": nulo, "4": 1, "5": 8}
01-05-2018 00:00:00 localização_00 {"1": nulo, "2": 9, "3": 10, "4": 8, "5": 3}

Gostaria de aplicar outro SELECT, que adiciona uma linha para cada par de valores que não possui valor nulo, onde a chave vai para a coluna thing_type e o valor vai para a coluna total; assim:

data_agrupada localização tipo_coisa total
01-06-2018 00:00:00 localização_00 1 1
01-06-2018 00:00:00 localização_00 4 1
01-06-2018 00:00:00 localização_00 5 8
01-05-2018 00:00:00 localização_00 2 9
01-05-2018 00:00:00 localização_00 3 10
01-05-2018 00:00:00 localização_00 4 8
01-05-2018 00:00:00 localização_00 5 3

O banco de dados do violino pode ser encontrado aqui .

ATUALIZAR:

Graças a @Gerard H. Pille , eu ajusto um pouco a resposta dele a isso:

SELECT
  DATE_TRUNC('month', arrive_date) AS grouped_date,
  LOWER(arrive_location) AS location,
  x.key::int thing_type, sum(x.value::int) total
FROM preprocess_things
JOIN  jsonb_each(data) x ON (x.key::int = ANY('{1,2,3}'::int[]))
GROUP BY grouped_date,  location, x.key::int
ORDER BY grouped_date,  location, x.key::int;

Como existem alguns casos em que eu só preciso de uma seleção do tipo de coisa e nem todos eles para serem calculados, o único problema é adicionar o JOIN e comparar a velocidade da consulta não é tão boa.

select postgresql-13
  • 1 1 respostas
  • 74 Views

1 respostas

  • Voted
  1. Best Answer
    Gerard H. Pille
    2022-02-20T08:56:59+08:002022-02-20T08:56:59+08:00
    SELECT
      DATE_TRUNC('month', arrive_date) AS grouped_date,
      LOWER(arrive_location) AS location,
      x.key::int  thing_type, sum(x.value::int) total
        FROM preprocess_things,
             jsonb_each(data) x
      GROUP BY grouped_date,  location, x.key::int
      order by grouped_date,  location, x.key::int;
    

    veja db<>violino

    • 4

relate perguntas

  • Deslocar dados do banco de dados para outra coluna

  • Como usar variáveis ​​dentro de um select (SQL Server)?

  • Seleção mysql complexa

  • "Para cada grupo de resultados cumprindo a condição X, selecione apenas o resultado com o menor valor da coluna A"

  • Como SELECIONAR a partir dos resultados SHOW TABLE STATUS

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