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 / 227515
Accepted
Eduard Sukharev
Eduard Sukharev
Asked: 2019-01-19 12:16:34 +0800 CST2019-01-19 12:16:34 +0800 CST 2019-01-19 12:16:34 +0800 CST

Obter incremento de valor durante uma hora de um dia

  • 772

Eu consulto a API de dados do YouTube para obter uma lista dos vídeos mais populares em um canal e, em seguida, obtenho suas estatísticas, 4 vezes por hora (a cada 15 minutos, por cron). Os dados são armazenados no Postgres, mas despejá-los e carregá-los em outro banco de dados SQL não seria um problema. Agora tenho a seguinte tabela de dados:

 video_id| views_count | likes_count | timestamp 
---------+-------------+-------------+---------------------
     foo | 100         | 1           | 2018-12-01 12:01:03
     foo | 101         | 1           | 2018-12-01 12:16:06
     foo | 105         | 1           | 2018-12-01 12:31:01
     bar | 199         | 0           | 2018-12-01 12:01:02
     bar | 200         | 0           | 2018-12-01 12:16:08
     bar | 301         | 5           | 2018-12-01 12:31:02
     ... | ...

UPD: Aqui está o esquema (colado em sqlfiddle ):

CREATE TABLE video_statistics
(
  video_id TEXT not null,
  views_count INTEGER not null,
  likes_count INTEGER not null,
  timestamp TIMESTAMPTZ not null
);

Como devo consultar esses dados para obter incrementos por hora view_countse likes_countcolunas, agrupados por vídeo? Para esclarecer o que quero obter:

hour_of_day|video_id|views_increment|likes_increment
-----------+--------+---------------+---------------
     ...   | ...
     11    | foo    | 4             | 0
     12    | foo    | 5             | 1
     ...   | ...
     11    | bar    | 73            | 0
     12    | bar    | 102           | 5
     ...   | ...

Em outras palavras, é um "melhor momento para postar vídeo" com base em dados históricos, levando em consideração dados durante muitas semanas e meses. Devo despejar os dados em algum banco de dados de série temporal ou outro, mais apropriado para esses casos, e consultá-lo lá? Ou devo apenas recorrer a calcular isso no código?

postgresql aggregate
  • 2 2 respostas
  • 325 Views

2 respostas

  • Voted
  1. Best Answer
    sticky bit
    2019-01-19T14:42:17+08:002019-01-19T14:42:17+08:00

    Uma possibilidade é primeiro row_number()os registros para obter o primeiro e o último valor por vídeo, dia e hora. Em seguida, junte os dois conjuntos de primeiro e último valores para obter as respectivas diferenças. Agrupe o resultado em vídeo e hora e obtenha a soma ou a média por vídeo por dia.

    SELECT first.video_id,
           first.timestamp_hour,
           sum(last.views_count - first.views_count) views_count_diff_sum,
           sum(last.likes_count - first.likes_count) likes_count_diff_sum,
           avg(last.views_count - first.views_count) views_count_diff_avg,
           avg(last.likes_count - first.likes_count) likes_count_diff_avg
           FROM (SELECT video_id,
                 timestamp_day,
                 timestamp_hour,
                 views_count,
                 likes_count
                 FROM (SELECT video_id,
                              timestamp::date timestamp_day,
                              date_part('hour', timestamp) timestamp_hour,
                              views_count,
                              likes_count,
                              row_number() OVER (PARTITION BY video_id,
                                                              timestamp::date,
                                                              date_part('hour', timestamp)
                                                 ORDER BY timestamp ASC) rn
                              FROM elbat) first
                 WHERE rn = 1) first
                INNER JOIN (SELECT video_id,
                                   timestamp_day,
                                   timestamp_hour,
                                   views_count,
                                   likes_count
                                   FROM (SELECT video_id,
                                                timestamp::date timestamp_day,
                                                date_part('hour', timestamp) timestamp_hour,
                                                views_count,
                                                likes_count,
                                                row_number() OVER (PARTITION BY video_id,
                                                                                timestamp::date,
                                                                                date_part('hour', timestamp)
                                                                   ORDER BY timestamp DESC) rn
                                                FROM elbat) last
                                   WHERE rn = 1) last
                           ON last.video_id = first.video_id
                              AND last.timestamp_day = first.timestamp_day
                              AND last.timestamp_hour = first.timestamp_hour
           GROUP BY first.video_id,
                    first.timestamp_hour;
    
    • 2
  2. Lennart - Slava Ukraini
    2019-01-19T14:03:14+08:002019-01-19T14:03:14+08:00

    Esquema:

    create table T 
    ( video_id char(3) not null
    , views_count int not null
    , likes_count int not null
    , ts timestamp not null
    );
    

    Adivinhe algo como:

    select hr, video_id
         , lag(vc) over (partition by video_id
                         order by hr) - vc as vc_incr
         , lag(lc) over (partition by video_id
                         order by hr) - lc as lc_incr                
    from (                          
        select extract(hour from ts) as hr
             , video_id
             , sum(views_count) as vc
             , sum(likes_count) as lc
        from t
        group by extract(hour from ts)
               , video_id
     ) as tt;
    

    Observe que você terá que decidir o que fazer com as linhas que não possuem uma linha de atraso, ou seja, a primeira linha em cada partição.

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

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

  • 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