TransWikia.com

Consultar os 3 últimos dias em que houve registro na tabela

Stack Overflow em Português Asked on September 26, 2021

Tenho uma tabela chamada OperacoesCaixa e nela tenho os seguintes campos:

Cod, Valor, DataOp

Bom preciso fazer um select que me retorne os lançamentos dos 3 últimos dias, porém não quero ter que informar uma data.

Supondo que tenho um lançamento realizado 15 dias a trás o select tem que retornar os 3 último dias.

Eu tentei fazer da seguinte forma:

SELECT
    *
FROM
    OperacoesCaixa
WHERE
    DataOp BETWEEN CURDATE() - INTERVAL 3 DAY AND CURDATE()
ORDER BY
    DataOp
DESC

O problema e que ele pega a data atual, se não houver nenhum lançamento nos últimos 3 dias o select não vai me retornar nada.

——– edit ——–

Bom para facilitar vou posta um exemplo real.

Vamos usar a data de 17-07-2020 como referência do dia da consulta.

Exemplo 1:

Tenho os seguintes dados na tabela:

Cod Valor       DataOp

1   85.20       13-07-2020
2   97.14       13-07-2020
3   89          13-07-2020
4   100         15-07-2020
5   247.85      15-07-2020
6   58          16-07-2020
7   97          16-07-2020
8   86          16-07-2020
9   875         17-07-2020
10  85.20       17-07-2020

Bom o select deve retornar o seguinte resultado:

10  85.20       17-07-2020
9   875         17-07-2020
8   86          16-07-2020
7   97          16-07-2020
6   58          16-07-2020
5   247.85      15-07-2020
4   100         15-07-2020

Ou seja, os lançamento dos 3 últimos dias.

Exemplo 2 notem que nos 3 últimos dias não houve lançamentos:

Tenho os seguintes dados na tabela:

Cod Valor       DataOp

1   85.20       5-07-2020
2   97.14       5-07-2020
3   89          5-07-2020
4   100         8-07-2020
5   247.85      8-07-2020
6   58          9-07-2020
7   97          9-07-2020
8   86          10-07-2020
9   875         10-07-2020
10  85.20       10-07-2020

A resposta deve ser:

10  85.20       10-07-2020
9   875         10-07-2020
9   875         10-07-2020
8   86          10-07-2020
7   97          9-07-2020
6   58          9-07-2020
5   247.85      8-07-2020
4   100         8-07-2020

Resumindo independente da data de hoje quero que seja listado todos os registros dos 3 dias que houve registro.

2 Answers

Creio ser algo assim , posso ter errado em algum detalhe da síntaxe

--1
SELECT
    distinct DataOp
FROM
    OperacoesCaixa
order by DataOp desc    
    
--2 
select DataOp
from
(
SELECT
    distinct DataOp
FROM
    OperacoesCaixa
order by DataOp desc
) virtual limit 3

--3
select *
from 
where DataOp in
(select DataOp
from
(
SELECT
    distinct DataOp
FROM
    OperacoesCaixa
order by DataOp desc
) virtual limit 3
) virtual2

Answered by Motta on September 26, 2021

Se são os últimos 3 dias, seria mais fácil dizer "data maior que data atual - 3", o que em um comando SQL seria:

WHERE DataOp > CURDATE() - INTERVAL 3 DAY

Pronto, vou deixar a query anterior, porque pode interessar a alguém.

Agora vamos ao caso da pergunta. Como precisa listar os valores todos, pegando as últimas datas, precisa de uma subquery. Se fossem totais, bastava agrupar por data, order e pegar as últimas 3, assim:

select DataOp, SUM(Valor) from OperacoesCaixa
group by DataOp
order by DataOp DESC
limit 3;

Como precisa listar tudo, podemos usar essa mesma query para selecionar as datas, removendo o SUM é claro e colocar na query principal:

select * from OperacoesCaixa
where DataOp in (select * from (
                 select DataOp from OperacoesCaixa
                  group by DataOp
                  order by DataOp DESC
                  limit 3) as sub)
order by DataOp desc; 

Note que, eu adicionei um segundo nível na subquery, isso porque a subquery direta dá erro ao usar o LIMIT, que aqui é essencial para pegar as 3 datas apenas.

Veja aqui funcionando: https://www.db-fiddle.com/f/2X55LZBmqcFh7WHnaKMAfo/1

Answered by Ricardo Pontual on September 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP