agrupe a resposta sql por chave ao renomear a coluna para um valor

Júlio

Dada a seguinte estrutura de banco de dados https://drawsql.app/sensor_network/diagrams/db , gostaria de obter todos os sensores_data de um determinado local, enquanto agrupava a resposta usando station.location, sensor_data.time.

Tenho a seguinte consulta:

select 
  station.location_name,
  sensor_data.time,
  sensor.type,
  sensor_data.value,
  sensor.id
from station
  inner join 
    (sensor inner join sensor_data on sensor.id = sensor_data.sensor_id)
  on station.sensor_id = sensor.id
where station.location = ?

que me dá as linhas que eu quero, no entanto, gostaria de formatar a resposta de uma forma que todas as linhas que compartilham local e hora estejam na mesma linha. uma saída de exemplo é

localização Tempo tipo valor identificação
cidade1 01-01-2022 08:00:00 temperatura 290 1
cidade1 01-01-2022 09:00:00 temperatura 292 1
cidade1 01-01-2022 08:00:00 ph 7 2
cidade1 01-01-2022 09:00:00 ph 8 2

que eu gostaria de formatar como (ou semelhante a)

[
{"location": "city1", "time": "2022-01-01 08:00:00", "temperature": 290, "ph": 7},
{"location": "city1", "time": "2022-01-01 09:00:00", "temperature": 292, "ph": 8},
]
or
[
{"location": "city1", "time": "2022-01-01 08:00:00", "sensors": [{"id": 1, "type": "temperature", "value": 290}, {"id": 2, "type": "ph", "value": 7}]},
{"location": "city1", "time": "2022-01-01 09:00:00", "sensors": [{"id": 1, "type": "temperature", "value": 292}, {"id": 2, "type": "ph", "value": 8}]}
]

Atualmente, estou fazendo essa formatação em javascript usando funções de array, mas isso se mostrou muito lento. Eu tentei usar group bya consulta, mas para ser justo, estou lutando para entender como usar isso quando você não deseja usar métodos como contagem etc.

Estou usando o nodejs e seu pacote mysql, o banco de dados é mysql:8 e as tabelas estão rodando com o motor innodb

usuário14967413

Você pode conseguir isso com subconsultas.

SELECT 
  st.location,
  sd.time,
  (
    SELECT sd2.value
    FROM sensor_data sd2
    INNER JOIN sensor s2
      ON s2.id = sd2.sensor_id
    WHERE sd2.time = sd.time
      AND s2.type = "temperature"
  ) AS temperature,
  (
    SELECT sd2.value
    FROM sensor_data sd2
    INNER JOIN sensor s2
      ON s2.id = sd2.sensor_id
    WHERE sd2.time = sd.time
      AND s2.type = "ph"
  ) AS ph
FROM station st
  INNER JOIN sensor s
    ON st.sensors = s.id
  INNER JOIN sensor_data sd
    ON s.id = sd.sensor_id
WHERE st.location = ?
GROUP BY sd.time

Obviamente, isso funcionará apenas se você conhecer a lista de tipos (temperatura, ph) com antecedência e, portanto, poderá escrever subconsultas separadas para cada um deles.

Se você não quiser criar uma subconsulta separada para cada tipo, poderá concatenar os valores em uma única coluna de subconsulta.

SELECT 
  st.location,
  sd.time,
  (
    SELECT 
      GROUP_CONCAT(
        CONCAT(s2.type, ':', sd2.value)
        SEPARATOR ','
      )
    FROM sensor_data sd2
    INNER JOIN sensor s2
      ON s2.id = sd2.sensor_id
    WHERE sd2.time = sd.time
    GROUP BY sd2.time
  ) AS sensors
FROM station st
  INNER JOIN sensor s
    ON st.sensors = s.id
  INNER JOIN sensor_data sd
    ON s.id = sd.sensor_id
WHERE st.location = ?
GROUP BY sd.time;

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Agrupe por% para calcular o peso de um valor de coluna não numérica

Agrupe por% para calcular o peso de um valor de coluna não numérica

Agrupe por uma coluna e selecione um valor específico de outra coluna no dataframe do pandas

Python Pandas: classifique e agrupe por, em seguida, some duas linhas consecutivas da 2ª coluna para um valor específico de uma 3ª coluna

Problema ao definir um valor na coluna de chave estrangeira

Agrupe um conjunto de dados por um valor de coluna derivado

Agrupe por uma coluna e encontre a soma e o valor máximo para outra em pandas

Pandas: agrupe uma coluna por data e conte o número acumulado de um valor específico em outra coluna

Excel: Agrupe por coluna e verifique se outra coluna contém um valor maior ou menor que 3

SQL Server: como ajustar automaticamente um valor fora do intervalo para uma coluna ao inserir / atualizar?

Navegando por uma resposta JSON para capturar um valor

Multiplique a coluna de um dataframe por um valor de outro dataframe, determinado por uma chave

Multiplique a coluna de um dataframe por um valor de outro dataframe, determinado por uma chave

Oracle SQL REGEXP para substituir uma string específica por um valor de coluna diferente

Pandas: agrupe linhas por valor de coluna semelhante

Agrupe por coluna "grp" e comprima DataFrame - (pegue o último valor não nulo para cada coluna, ordenando por coluna "ord")

Renomear coluna em tabela agrupada por valor de linha (dplyr)

excluir pares de chave / valor específicos por nome de chave ao copiar o conteúdo de um objeto para outro

Nome de coluna ambíguo ao selecionar uma coluna para retornar o valor se a coluna estiver disponível na tabela por comandos Executar SQL Dinâmico

Agrupe um dataframe do pandas por uma coluna OU outro

Agrupe um dataframe do pandas por uma coluna OU outro

Caso do SQL Server quando e agrupe para retornar um valor quando nenhuma linha for retornada

Agrupe por grep para termos em uma coluna com dplyr

Agrupe por grep para termos em uma coluna com dplyr

Agrupe linhas por um determinado identificador e atualize uma coluna de id de grupo para rastrear a qual grupo eles pertencem

Crie a coluna Dataframe que usa um dicionário para mapear a chave correspondente, valor em um dataframe

Como renomear a chave para um objeto JSON aninhado em Python

Agrupe o valor-chave do banco de dados plano apenas por partes-chave

Coluna Python DataFrame para chave e valor

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo