Pessoal tenho uma tabela assim:
data_pregao| ativo | valor_cotacao | arquivo
|2020-07-30 |BEES3 | 5.85 | arquivo30
|2020-07-30 |BEES4 | null | arquivo30
|2020-07-30 |CARE11 | 0.95 | arquivo30
…
|2020-07-29|BEES3 | 5.85 | arquivo29
|2020-07-29||BEES4 | 3,21 | arquivo29
|2020-07-29|CARE11 | 0.95 | arquivo29
…
|2019-07-28|CARE11 | 8.95 | arquivo28
E preciso retornar o ultimo valor de cotação para o ativo, nos casos em que não tem cotação no dia.
|2020-07-30 |BEES3 | 5.85 | arquivo30
|2020-07-30 |BEES4 | 3,21 | arquivo30
|2020-07-30 |CARE11 | 0.95 | arquivo30
alguém tem uma ideia de como posso fazer isso? Obrigado.
Será que assim resolve:
SELECT t.data_pregao, t.ativo, t.valor_cotacao, t.arquivo
FROM tabela t
WHERE t.ativo IN (
SELECT t1.ativo
FROM tabela t1
WHERE t1.valor_cotacao = (
SELECT MAX(t2.valor_cotacao)
FROM tabela t2
WHERE t1.ativo = t2.ativo
AND t2.valor_cotacao IS NOT NULL
)
)
Não sou muito bom em banco, acredito que tenha forma melhor de tentar fazer isso que vc precisa.
Lucas, tentei aqui mas fica rodando e não finaliza.
assim como uma outra forma que tentei…
select a.dt_pregao, a.co_ativo,
nullif(a.vr_cotacao, (select b.vr_cotacao
from tabela b
where b.co_ativo = a.co_ativo and b.dt_pregao between '2020-07-01' and '2020-07-30' and b.vr_cotacao is not null
order by b.dt_pregao desc limit 1))
from tabela a
where a.dt_pregao between '2020-07-01' and '2020-07-30'
order by a.dt_pregao desc;
não manjo de banco e estou quebrando a cabeça para fazer essa consulta.
Valeu cara!!!
E assim?
SELECT
a.dt_pregao,
a.co_ativo,
a.vr_cotacao
FROM tabela a
WHERE a.dt_pregao BETWEEN '2020-07-01' AND '2020-07-30'
AND a.co_ativo IN (
SELECT MAX(b.co_ativo)
FROM tabela b
WHERE b.co_ativo = a.co_ativo
AND b.dt_pregao BETWEEN '2020-07-01' AND '2020-07-30'
AND b.vr_cotacao IS NOT NULL
)
ORDER BY a.dt_pregao DESC;
Tinha pensado numa parada errado na primeira query que mandei.
vou tentar aqui, o problema é que assim vai trazer o maior valor, creio, e preciso do ultimo e pode não ser o maior.