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 / 328584
Accepted
Thomas
Thomas
Asked: 2023-06-23 22:41:35 +0800 CST2023-06-23 22:41:35 +0800 CST 2023-06-23 22:41:35 +0800 CST

Obter linhas para um determinado intervalo de tempo, mais uma linha anterior

  • 772

Tenho uma tabela na qual tenho consultas que retornam dados de um intervalo de tempo. As linhas são esparsas e os eventos podem ter dias de intervalo.

Estou procurando uma maneira de obter os dados do intervalo + adicionar a linha antes do início do intervalo (que pode ser em qualquer carimbo de data / hora menor que o início).

Por exemplo:

2020-01-01 xxxxxxx
2020-01-12 xxxxxxx
2020-02-10 xxxxxxx
2020-02-11 xxxxxxx
2020-02-15 xxxxxxx

Se eu consultar de 2020-02-08para 2020-02-14, obterei:

2020-02-10 xxxxxxx
2020-02-11 xxxxxxx

Mas gostaria de obter:

2020-01-12 xxxxxxx
2020-02-10 xxxxxxx
2020-02-11 xxxxxxx

Como isso pode ser feito?

postgresql
  • 2 2 respostas
  • 37 Views

2 respostas

  • Voted
  1. Best Answer
    Ergest Basha
    2023-06-23T23:24:19+08:002023-06-23T23:24:19+08:00

    Uma solução simples que dará o resultado desejado, mas para dados maiores você pode ter algum problema de desempenho.

    Para encontrar o valor atual anterior de 2020-02-10,

    with cte as (
    SELECT  dt,
            LAG(dt,1) OVER ( ORDER BY dt asc ) AS previous_dt
    FROM test_tbl 
      ) select previous_dt as dt from cte where  '2020-02-10' IN (dt,previous_dt);
    

    Use a união para combinar com a pesquisa de intervalo,

    with cte as (
    SELECT  dt,
            LAG(dt,1) OVER ( ORDER BY dt asc ) AS previous_dt
    FROM test_tbl 
      ) select previous_dt as dt from cte where  '2020-02-10' IN (dt,previous_dt)
        union 
        SELECT dt
        FROM test_tbl 
        WHERE dt >='2020-02-08' AND dt<='2020-02-14'  ;
    

    Resultado,

       dt
    2020-01-12
    2020-02-11
    2020-02-10
    

    Veja exemplo aqui

    • 1
  2. Erwin Brandstetter
    2023-06-25T08:21:40+08:002023-06-25T08:21:40+08:00

    Isso deve ser mais rápido e simples:

    (  -- parentheses required
    SELECT *
    FROM   tbl
    WHERE  dt < '2020-02-08'
    ORDER  BY dt DESC
    LIMIT  1
    )
    
    UNION ALL
    SELECT *
    FROM   tbl
    WHERE  dt BETWEEN '2020-02-08' AND '2020-02-14'
    -- ORDER BY dt -- optional
    ;
    

    violino

    Com um índice ativado, (dt)você obtém duas varreduras de índice muito rápidas.

    Se houver duplicatas em (dt), você terá que definir qual linha anterior selecionar ou aceitar a seleção arbitrária da consulta fornecida.

    Use UNION ALL, não UNION, que tentaria remover duplicatas - o que é uma perda de tempo ou não é o que você deseja. UNIONtambém pode reordenar as linhas de resultado como efeito colateral.

    Sobre parênteses em UNIONconsultas:

    • Combinando 2 consultas SELECT e imprimindo os resultados no PostgreSQL

    Isso normalmente retorna linhas classificadas por dt. Mas veja:

    • A ordem é preservada após UNION no PostgreSQL?
    • Os resultados das cláusulas UNION ALL são sempre anexados em ordem?

    Portanto, você pode acrescentar ORDER BY dtcomo comentado para garantir resultados classificados.

    • 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