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 / 问题

All perguntas(dba)

Martin Hope
Aaron
Asked: 2023-11-23 03:47:54 +0800 CST

Cláusulas PIVOT múltiplas do Oracle

  • 6

Tenho dados com duas colunas de intervalo calculadas que gostaria de resumir com uma consulta PIVOT. Este é um exemplo de conjunto de dados pré-gerados. Minhas colunas de balde aqui são segundos e pct.

select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct from dual
union all
select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct' from dual
union all
select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct' from dual
union all
select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct' from dual
union all
select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct' from dual
union all
select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct' from dual

A saída deve ficar assim

gato lt_1_seg lt_2_seg lt_25_pct lt_50_pct lt_75_pct
a 2 4 3 2 1

Eu gostaria de focar nos valores de sec e pct de forma independente. Sou capaz de usar uma cláusula pivô para fazer isso em um ou outro, ou uma permutação de todos os valores de sec por todos os valores de pct, mas não de forma independente e simultânea.

Eu tentei várias cláusulas pivot, que criam algum comportamento inesperado, vários valores na cláusula pivot-for, que cria uma permutação de todos os valores, e múltiplas funções de agregação, que executam apenas múltiplas opções de agregação em uma única coluna.

Exemplo não funcional um com múltiplas cláusulas pivot (os dados retornados estão incorretos):

with dummy_data as (
                     select cat, sec, pct
                     from (
                            select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
                            from dual
                            union all
                            select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
                            from dual
                          )
                   ),
     dummy_pvt as (
                    select *
                    from dummy_data pivot (count(*) for (sec) in ('lt_1_sec' as lt_1_sec,
                      'lt_2_sec' as lt_2_sec)) pivot (count(*) for (pct) in ('lt_25_pct' as lt_25_pct,
                      'lt_50_pct' as lt_50_pct,
                      'lt_75_pct' as lt_75_pct))
                  )
select cat, sum(lt_1_sec), sum(lt_2_sec), sum(lt_25_pct), sum(lt_50_pct), sum(lt_75_pct)
from dummy_pvt
group by cat;
GATO SOMA(LT_1_SEC) SOMA(LT_2_SEC) SOMA(LT_25_PCT) SOMA(LT_50_PCT) SOMA(LT_75_PCT)
a 2 4 1 1 1

Exemplo não funcional dois com vários valores pivot-for (não deve produzir uma permutação de todas as combinações de valores)

with dummy_data as (
                     select cat, sec, pct
                     from (
                            select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
                            from dual
                            union all
                            select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
                            from dual
                          )
                   )
select *
from dummy_data pivot (count(*) for (sec, pct) in (
  ('lt_1_sec', 'lt_25_pct') as lt_1_25, 
  ('lt_1_sec', 'lt_50_pct') as lt_1_50, 
  ('lt_1_sec', 'lt_75_pct') as lt_1_75, 
  ('lt_2_sec', 'lt_25_pct') as lt_2_25,
  ('lt_2_sec', 'lt_50_pct') as lt_2_50,
  ('lt_2_sec', 'lt_75_pct') as lt_2_75));
GATO LT_1_25 LT_1_50 LT_1_75 LT_2_25 LT_2_50 LT_2_75
a 2 0 0 1 2 1

Exemplo não funcional três com múltiplas funções agregadas (cria apenas colunas para os valores sec)

with dummy_data as (
                     select cat, sec, pct
                     from (
                            select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
                            from dual
                            union all
                            select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
                            from dual
                            union all
                            select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
                            from dual
                            union all
                            select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
                            from dual
                          )
                   )
select *
from dummy_data pivot (count(sec) sec_cnt, count(pct) pct_cnt for (sec) in (
  ('lt_1_sec') as lt_1_sec,
  ('lt_2_sec') as lt_2_sec));
GATO LT_1_SEC_SEC_CNT LT_1_SEC_PCT_CNT LT_2_SEC_SEC_CNT LT_2_SEC_PCT_CNT
a 2 2 4 4

Não há realmente nenhuma maneira de realizar vários pivôs em conjuntos separados de valores na mesma consulta sem permutar os valores?

grupo pivô_1_a pivô_1_b pivô_2_x pivô_2_y pivô_2_z
a cnt_a cnt_b cnt_x cnt_y cnt_z

Onde A+B = X+Y+Z = contagem()

oracle
  • 1 respostas
  • 26 Views
Martin Hope
minicooper
Asked: 2023-11-23 01:29:01 +0800 CST

Substituindo substrings em elementos de array

  • 4

Eu tenho uma tabela com uma matriz de URLs em column urls. Agora é necessário atualizar alguns URLs alterando o nome do host. Por exemplo:

{https://storage.host1.com/file.jpg, https://storage.host1.com/file2.jpg}

Deve se tornar:

{https://data.newhost.net/file.jpg, https://data.newhost.net/file2.jpg}

Fiquei preso na substituição da string dos elementos da matriz.

postgresql
  • 1 respostas
  • 27 Views
Martin Hope
lifeisajourney
Asked: 2023-11-23 00:32:15 +0800 CST

Inserindo várias linhas em uma tabela e mapeando IDs recém-criados de volta ao rownum original em outra tabela - SQL Server

  • 5

Eu tenho as seguintes tabelas

    -- Create the #product table
    CREATE TABLE #product 
    (
        id UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
        name VARCHAR(100),
        createdDate DATE
    );
    
    -- Create the #tmpproducts table
    CREATE TABLE #tmpProducts
    (
        rownum INT PRIMARY KEY IDENTITY(1,1),
        name VARCHAR(100),
        createdDate DATE
    );

-- Insert data into #tmpSignings
INSERT INTO #tmpProducts (name, createdDate)
VALUES
    ('John Doe', '2023-11-22'),
    ('Jane Smith', '2023-11-23'),
    ('Alice Johnson', '2023-11-24'),
    ('Bob Williams', '2023-11-25'),
    ('Eva Brown', '2023-11-26'),
    ('Michael Davis', '2023-11-27'),
    ('Sophia Miller', '2023-11-28'),
    ('William Wilson', '2023-11-29'),
    ('Olivia Jones', '2023-11-30'),
    ('Daniel White', '2023-12-01');

Tenho 10 linhas em #tmpProducts e meu objetivo é inserir essas linhas na tabela #product. Para cada linha inserida com sucesso na tabela de produtos, preciso associar o ID recém-gerado ao rownum correspondente na tabela #tmpProducts. Como posso fazer isso? Qualquer ajuda é muito apreciada. Obrigado!

Resultado esperado:

#tmpProdutos :
nome rownum criadoData 1

#produtos :
insira a descrição da imagem aqui

resultado final :
insira a descrição da imagem aqui

sql-server
  • 1 respostas
  • 36 Views
Martin Hope
J. Mini
Asked: 2023-11-22 20:12:45 +0800 CST

Enormes esperas PREEMPTIVE_OS_GETPROCADDRESS de sp_OAMethod. Como depurar?

  • 3

Algumas consultas estão atingindo minha CPU com extrema força. sp_WhoIsActiveinforma qual sp_OAMethodé a causa (a sql_textcoluna aponta para ela) e que há grandes esperas do PREEMPTIVE_OS_GETPROCADDRESStipo wait. Dado que sp_OAMethodé um procedimento armazenado interno, como posso depurar isso?

Estou em uma versão 2019 do SQL Server, 15.0.alguma coisa.

sql-server
  • 1 respostas
  • 100 Views
Martin Hope
therobyouknow
Asked: 2023-11-22 05:34:06 +0800 CST

Consulta para converter uma coluna de números que corresponde a uma regex no MySQL

  • 5

Eu tenho uma coluna que contém valores de string no formato, por exemplo AB12345678- duas letras seguidas de 8 dígitos numéricos.

Eu preciso escrever uma consulta MySQL para inserir um 5antes de cada conjunto de 4 dígitos AB12345678se tornar AB5123455678.

Estou perto, o seguinte funciona para um valor na coluna, mas não para vários valores - todos os valores são escritos com o mesmo primeiro valor encontrado, ao que parece.

SELECT @twoeight := os_grid_ref FROM projects WHERE os_grid_ref REGEXP '[A-Z]{2}[0-9]{4}[0-9]{4}';
SELECT @prefix1 := SUBSTR(@twoeight,1,2);
SELECT @part1 := SUBSTR(@twoeight,3,4);
SELECT @part2 := SUBSTR(@twoeight,7,4);
UPDATE projects SET os_grid_ref=CONCAT(@prefix1,'5',@part1,'5',@part2) WHERE os_grid_ref REGEXP '[A-Z]{2}[0-9]{4}[0-9]{4}';

O que preciso ajustar para que a consulta possa modificar cada valor da coluna individualmente.

Obrigado.

mysql
  • 1 respostas
  • 21 Views
Martin Hope
Axeltherabbit
Asked: 2023-11-21 23:40:54 +0800 CST

Como obtenho o objeto que executou a consulta de um identificador de consulta?

  • 6

O banco de dados é o Microsoft SQL Server. Eu tenho um identificador de consulta ( sql_handle) desys.dm_exec_query_stats

Existe uma maneira de obter o objeto do qual a consulta faz parte? por exemplo eu quero ter dbname.viewnameoudbname.storedprocedurename

Eu sei que posso usar sys.dm_exec_sql_text(sql_handle)e usar o textcampo para obter a consulta completa, mas esperava algo que me desse o caminho sem ter que analisar essa string

sql-server
  • 2 respostas
  • 48 Views
Martin Hope
riwu
Asked: 2023-11-21 23:04:04 +0800 CST

Aplicar restrição exclusiva sem desnormalização

  • 7

Opção 1

Eu tenho um esquema de banco de dados parecido com este:
https://dbfiddle.uk/JKCTjadD
insira a descrição da imagem aqui

  1. A Taskpertence a a Service(como em ECS )
  2. A Taskpode ser reatribuído a outro Service.
  3. TaskConfigrastreia o histórico de reatribuições (e outras configurações), e o registro mais recente (usando inserted_on DESC) é aquele Serviceao qual a Taskestá atualmente atribuído.
  4. A Servicetem uma restrição única ( service_name, environment). O ambiente tem sua própria tabela, mas ilustrada aqui como um Enum por questões de brevidade.
  5. A Tasktambém tem uma restrição única ( task_name, environment).

O problema

O environmentin Taské duplicado/redundante: o Serviceassociado ao Taskjá possui o environmentque Taskestá dentro.

opção 2

Decidi mudar para Service_id: https://dbfiddle.uk/QB7k9hK3 Posso então usar a seguinte consulta para buscar os pares mais recentes de ( , ):TaskConfigTask

insira a descrição da imagem aqui
task_nameenvironment_name

SELECT DISTINCT ON (task_name, environment_name) * 
FROM TaskConfig 
JOIN Task ON Task.id = Task_id
JOIN Service ON Service.id = Service_id
ORDER BY task_name, environment_name, inserted_on DESC

O problema

  1. Não posso mais ter uma restrição exclusiva em ( task_name, environment) pois environmentnão está na Tasktabela.
  2. Um futuro desenvolvedor pode selecionar erroneamente ( task_name, Service_id) o que não resultará em pares exclusivos ( task_name, environment).

Ajuda

Como você proporia resolver os problemas acima?
Se não houver maneiras melhores, qual das duas opções acima é o melhor esquema?

postgresql
  • 1 respostas
  • 68 Views
Martin Hope
jahu
Asked: 2023-11-21 22:47:46 +0800 CST

Para um espaço de tabela, o que significa o valor 3 na coluna online?

  • 6

Tenho um espaço de tabela problemático do qual não consigo me livrar. Quando tento abandoná-lo, sou informado de que ele não existe, mas quando olho para TS$ele definitivamente está lá. A única pista que tenho agora é que tem o valor 3 escrito em column Online$. Suponho que significa que está oculto, mas verdade seja dita, não consigo encontrar informações concretas sobre esta coluna na internet. O que esse valor significa? Posso alterá-lo novamente para online / offline para poder abandoná-lo?

oracle
  • 1 respostas
  • 35 Views
Martin Hope
Eoin Fitzpatrick
Asked: 2023-11-21 14:42:43 +0800 CST

Como melhorar o desempenho da função agregada personalizada e identificar gargalos

  • 6

Esta é uma continuação de uma pergunta que fiz sobre a melhor maneira de calcular estatísticas em uma lista de linhas exclusivas por coluna, que pode ser encontrada aqui (junto com o esquema da tabela)

Eu tenho uma tabela que contém milhões de linhas de dados de estoque e quero calcular agregados personalizados nessas linhas. A ideia é anexar cada valor de entrada na função de transição de estado. Então o finalfunc calculará o número neste array. O agregado é definido como:

create or replace aggregate RSI(input float8) (
  SFUNC=tech_float8_accum,
  STYPE=float8[],
  FINALFUNC=RSI_Func
);

Onde implementei ingenuamente a função de agregação de array no plpython:

-- Append the next input value to the state array
CREATE OR REPLACE function tech_float8_accum(agg float8[], input float8)
returns float8[]
AS $$
    return agg + [input] if agg != None else [input]
$$ LANGUAGE plpython3u;

O finalfunc também é escrito em plpython e, por experiência própria, é bastante rápido, pelo menos fora do contexto de banco de dados, já que usa Cython nos bastidores.

CREATE OR REPLACE FUNCTION RSI_Func(input float8[], out val float8)
AS $$
    import talib
    import numpy as np
    
    cd=np.array(input)
    rsi = talib.RSI(cd)
    return rsi[-1]
$$ LANGUAGE plpython3u;

Uso atual:

select "security", RSI(ordered.close)
        from (
            select "security", close
            from stocks_data.bars
            where "timeframe" = '1d'
            and "timestamp" >= '2022-11-02'::timestamp
            order by "timestamp" asc
        ) as ordered
        group by ordered.security;

Isso leva aproximadamente 3 minutos , quando na realidade preciso de algo em torno de 3 segundos ou menos, como a função AVG integrada oferece.

Há algo que eu possa fazer para melhorar drasticamente essa abordagem ou devo adotar outra abordagem? São muitos dados para trazer na memória.

Análise da consulta de uso: insira a descrição da imagem aqui

postgresql
  • 1 respostas
  • 29 Views
Martin Hope
fah81
Asked: 2023-11-21 03:50:47 +0800 CST

PostgresSQL: Copie a tabela do esquema A para o esquema B no mesmo banco de dados

  • 5

Tenho o seguinte cenário, tenho um esquema chamado A e um esquema chamado B. Ambos estão no mesmo BD, ambos contém a mesma tabela, só que no esquema B não tem conteúdo, pois trunquei a tabela com a instrução TRUNCATE.

Tentei usar o aplicativo pg_dumpe pg_restorecom o seguinte comando.

pg_dump --file "table.sql" --username "user" --no-password --verbose --format=p --data-only --table "schemaA.tablename" "db"

Obtenha um script SQL com a seguinte instrução:

COPY schemaA.tablename (column1, column2...) FROM STDIN;

//data

Eu tentei mudar isso

Eu tentei mudar isso COPYpara schemaBmas sem sucesso, a FROM STDINafirmação que presumo é por que pg_restoreleva os dados através de um arquivo e aí está a STDINentrada, não poderia fazer assim? Já que fazer as alterações não funciona.

Se isso não for possível, a única coisa que consigo pensar é fazer o seguinte:

INSERT INTO schemaB.tablename
SELECT * FROM schemaA.tablename;

Há muitos dados, não sei até que ponto é aconselhável fazê-lo, qual seria o melhor passo a seguir?

Obrigado!!!

postgresql
  • 1 respostas
  • 17 Views
Prev
Próximo

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