Faça valores binários a partir dos 2 nomes de coluna principais que têm os valores mais altos de muitos nomes de coluna em SQL

Kevin Sun

Tenho uma tabela como a seguinte:

EU IRIA col1 col2 col3 col4
UMA 100 400 30 800
B 600 50 500 75

e eu quero uma consulta onde posso retornar algo como

EU IRIA col1 col2 col3 col4
UMA 0 1 0 1
B 1 0 1 0

Exceto, eu quero que a lógica olhe para cada linha e para cada linha encontre quais duas colunas têm os 2 valores principais. Eu imagino que pode haver alguns CTEs ou subconsultas envolvidos. Mesmo chegar a um CTE que produziria o seguinte resultado seria bom o suficiente, mas não sei como chegar a este CTE:

EU IRIA top_2_col_name
UMA col2
UMA col4
B col1
B col3

Existe uma maneira de fazer funções de agregação e janela em vez de colunas? Estou usando o BigQuery SQL do Google.

Gordon Linoff

Se você quiser os dois valores principais, um método é desaninhar os valores, calcular a classificação e selecioná-los:

with t as (
      select 'A' as id, 100 as col1, 400 as col2,  30 as col3, 800 as col4 union all
      select 'B' as id, 600 as col1, 50  as col2, 500 as col3, 75 as col4 
     )
select * except (seqnum)
from (select t.id, col.*, row_number() over (partition by t.id order by col.val desc) as seqnum
      from t cross join
           unnest(array[struct('col1' as col, t.col1 as val),
                              struct('col2', t.col2),
                              struct('col3', t.col3),
                              struct('col4', t.col4)
                             ]
                        ) col
     ) tc
where seqnum <= 2;

Esta é a segunda forma do seu conjunto de resultados.

Você pode generalizar isso para qualquer número de colunas usando um truque JSON. Isso produz uma string e, em seguida, analisa a string para as colunas de seu interesse, desaninha-as e realiza operações semelhantes:

with t as (
      select 'A' as id, 100 as col1, 400 as col2,  30 as col3, 800 as col4 union all
      select 'B' as id, 600 as col1, 50  as col2, 500 as col3, 75 as col4 
     )
select t.id, concat('col', n), val
from (select t.id, val, n, row_number() over (partition by t.id order by val desc) as seqnum
      from t cross join
           unnest(regexp_extract_all(to_json_string(t), '"col[0-9]+":([0-9]+)')) val with offset n
     ) t
where seqnum <= 2;

Isso pode funcionar em qualquer número de colunas. Obviamente, se você tiver uma estrutura de dados como essa, os valores devem ser armazenados em um array.

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

TOP lista

  1. 1

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

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

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

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

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

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

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

  16. 16

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

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo