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 / 61407
Accepted
Luan Huynh
Luan Huynh
Asked: 2014-03-21 19:37:01 +0800 CST2014-03-21 19:37:01 +0800 CST 2014-03-21 19:37:01 +0800 CST

Como somar a soma anterior, por exemplo, N = (N-1) + (N-2) + ... + 1?

  • 772

Eu tenho um nome de tabela " TABLE_A ( id integer, no integer) ".

Quero somar "não" com grupo por "id" e "soma de não" atual = "soma de não" anterior

Aqui está o meu código:

1/ Criar tabela e inserir dados:

create table table_a (id int, no int);

insert into table_a values(1, 10);
insert into table_a values(1, 20);
insert into table_a values(1, 30);
insert into table_a values(2, 100);
insert into table_a values(2, 200);
insert into table_a values(2, 300);
insert into table_a values(3, 1);
insert into table_a values(3, 2);
insert into table_a values(3, 3);
insert into table_a values(3, 3);

2/ Resultado desejado:

id | sum_of_no
--------------
1  | 60
2  | 660
3  | 669

3/ Minhas soluções (ok):

with t_report_code_temp as
(   
select id, sum(no) as t_code
from table_a
group by id 
)
select a.id, sum(b.t_code)
from t_report_code_temp a 
join t_report_code_temp b on b.id <= a.id
group by a.id
order by 1

Minha pergunta:

Você poderia me dar a melhor maneira de resolver?

postgresql join
  • 3 3 respostas
  • 13053 Views

3 respostas

  • Voted
  1. Luan Huynh
    2014-03-22T00:31:48+08:002014-03-22T00:31:48+08:00

    De Craig Ringer, ypercube.

    Aqui meus testes:

    create table table_a (id int, no int);
    
    insert into table_a  (1)
    select a, a
    from generate_series(1, 1000000) a
    

    Pergunta de Craig Ringer

    with t_report_code_temp(id, t_code) as
    (   
    select id, sum(no)
    from table_a
    group by id 
    )
    SELECT
      id,
      sum(t_code) OVER (ORDER BY id ASC)
    FROM t_report_code_temp;
    
    1.000.000 rows -> 5.5s
    2.000.000 rows -> 7s   (run (1) twice)
    

    consulta do ypercube

    SELECT
      id,
      SUM(SUM(no)) OVER (ORDER BY id ASC) AS sum_of_no
    FROM table_a
    GROUP BY id ;
    
    1.000.000 rows -> 3.7s
    2.000.000 rows -> 5.5s   (run (1) twice)
    

    Eu vejo a magia da função de janela. Obrigado !

    • 5
  2. Craig Ringer
    2014-03-21T20:42:10+08:002014-03-21T20:42:10+08:00

    Isso parece um candidato para funções de janela.

    Primeiro, calcule as somas per-id e, em seguida, faça uma soma contínua ordenada por ID para obter o resultado final desejado.

    with t_report_code_temp(id, t_code) as
    (   
    select id, sum(no)
    from table_a
    group by id 
    )
    SELECT
      id,
      sum(t_code) OVER (ORDER BY id ASC)
    FROM t_report_code_temp;
    
    • 4
  3. Best Answer
    ypercubeᵀᴹ
    2014-03-22T00:18:39+08:002014-03-22T00:18:39+08:00

    Melhorando (?) Na resposta de Craig Ringer. Menos código, mas não tenho certeza se é mais legível ou mais confuso:

    SELECT
      id,
      SUM(SUM(no)) OVER (ORDER BY id ASC) AS sum_of_no
    FROM table_a
    GROUP BY id 
    ORDER BY id ;
    

    Testado no SQL-Fiddle

    Você está certo em seu comentário, quando uma função de janela (ou um agregado com OVER()) tem um ORDER BY, então a janela padrão é: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWque produz um total em execução com SUM().


    O fluxo lógico de execução é:

    FROM table_a            -- get all rows of table_a
    
    -- WHERE                -- void here
    
    GROUP BY id             -- make groups of rows, one for each value of "id"
          -- SUM(no) AS y   -- and calculate aggregates, like SUM(no)
    
    -- HAVING               -- void here
    
    SELECT                  -- calculate window functions and window aggregates 
      id,                   -- and any other function used in SELECT or ORDER BY 
      SUM(y) OVER (ORDER BY id ASC) AS sum_of_no
    
    ORDER BY id             -- order the result set
    
    • 3

relate perguntas

  • Qual é a diferença entre um INNER JOIN e um OUTER JOIN?

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

  • Como é a saída de uma instrução JOIN?

  • 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