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 / 173226
Accepted
eComEvo
eComEvo
Asked: 2017-05-11 05:20:36 +0800 CST2017-05-11 05:20:36 +0800 CST 2017-05-11 05:20:36 +0800 CST

Calculando o intervalo em dias com base na velocidade média

  • 772

Tenho uma orderstabela e preciso calcular quando há uma mudança na contagem média ao longo do tempo. Isso pode ser um aumento ou uma diminuição.

Por exemplo, se geralmente há 1 pedido a cada dois dias, preciso detectar se de repente aumentou para 3 pedidos todos os dias ou diminuiu para 1 pedido a cada 3 dias.

Exemplo de estrutura e dados da tabela:

CREATE TABLE "public"."orders" (
    "id" SERIAL,
    "created_at" timestamp NOT NULL,
    PRIMARY KEY ("id")
);

INSERT INTO "orders" ("created_at")
VALUES
(now() - interval '1 hours'),
(now() - interval '6 hours'),
(now() - interval '12 hours'),
(now() - interval '2 days'),
(now() - interval '4 days'),
(now() - interval '6 days'),
(now() - interval '9 days');

No conjunto de dados acima, suponho que eu queria detectar que, ao longo da última semana, geralmente há apenas 1 pedido a cada 2 dias, mas nas últimas 24 horas esse padrão foi violado com 3 pedidos em um dia.

Resultado desejado:

  • Média de pedidos dos 7 dias anteriores por dia (não incluindo as últimas 24 horas): 0,43
  • Velocidade média do pedido dos 7 dias anteriores (não incluindo as últimas 24 horas): 1 pedido a cada 2 dias
  • Pedidos das últimas 24 horas: 3

Cenário alternativo:

INSERT INTO "orders" ("created_at")
VALUES
(now() - interval '12 hours'),
(now() - interval '2 days'),
(now() - interval '2 days'),
(now() - interval '2 days'),
(now() - interval '3 days'),
(now() - interval '3 days'),
(now() - interval '3 days'),
(now() - interval '4 days'),
(now() - interval '4 days'),
(now() - interval '4 days'),
(now() - interval '5 days'),
(now() - interval '5 days'),
(now() - interval '5 days'),
(now() - interval '6 days'),
(now() - interval '6 days'),
(now() - interval '6 days'),
(now() - interval '7 days'),
(now() - interval '7 days'),
(now() - interval '7 days');

Como alternativa, suponha que eu tenha o conjunto de dados acima. Normalmente, há aproximadamente 3 pedidos todos os dias na última semana, mas nas últimas 24 horas houve apenas 1 pedido.

Resultado desejado:

  • Média de pedidos dos 7 dias anteriores (não incluindo as últimas 24 horas): 2,57
  • Velocidade média dos pedidos dos 7 dias anteriores (não incluindo as últimas 24 horas): 3 pedidos a cada 1 dia
  • Pedidos das últimas 24 horas: 1

Como eu faria isso?

PostgreSQL 9.6

postgresql postgresql-9.6
  • 1 1 respostas
  • 593 Views

1 respostas

  • Voted
  1. Best Answer
    McNets
    2017-05-11T06:48:05+08:002017-05-11T06:48:05+08:00

    Primeiro conte os pedidos agrupados por dia dos últimos 7 dias e, em seguida, calcule as médias

    --= Count orders grouping by date
    WITH cn AS
    (
        SELECT created_at::date, COUNT(*) num_orders
        FROM   orders
        WHERE  created_at <  (now() - interval '1 days')
        AND    created_at >= (now() - interval '8 days')
        GROUP BY created_at::date
    )
    SELECT to_char(AVG(num_orders), '9.99') AS "AvgOrderVelocity",
           to_char(SUM(num_orders) / 7::decimal(18,2), '0.99')  AS "AvgLast7Days",
           (SELECT COUNT(*)
            FROM   orders
            WHERE  created_at > (now() - interval '1 days')) "Last24h"
    FROM   cn;
    

    Usando os primeiros dados de amostra:

    Pedidos agrupados por data:
    
    criado_at | num_orders
    :------------- | ---------:
    05-05-2017 | 1
    2017-05-07 | 1
    2017-05-09 | 1
    
    AvgOrderVelocity | AvgLast7Days | Last24h
    :--------------- | :----------- | ------:
     1.00            |  0.43        |       3
    

    dbfiddle aqui

    Usando dados de segunda amostra:

    Pedidos agrupados por data:
    
    criado_at | num_orders
    :------------- | ---------:
    04-05-2017 | 3
    05-05-2017 | 3
    06-05-2017 | 3
    2017-05-07 | 3
    2017-05-08 | 3
    2017-05-09 | 3
    
    AvgOrderVelocity | AvgLast7Days | Last24h
    :--------------- | :----------- | ------:
     3.00            |  2.57        |       1
    

    dbfiddle aqui

    • 0

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