I have this table called “valores_indices” where it imports stocks values every 1 hour, I need to get the values from each monitored stock at 8am and 6pm, those being respectively my “vlrAberto” and “vlrFechado” selects I don’t get why these are not merging, I’ve done it before, any help would be appreciated since I’m running out of ideas, I’ve tried to nest it without any luck
x
SELECT
i.descricao as cotacao,
m.quantidade as qtdComprada,
m.valor as vlrUnitario,
(m.valor * m.quantidade) as valorCompra,
v.valor as vlrAberto,
0 as vlrFechado,
v.data as data
FROM
movimento_indices m
LEFT JOIN indices i ON i.idindice = m.idindice
LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
v.hora IN ('08:00')
UNION ALL
SELECT
i.descricao as cotacao,
m.quantidade as qtdComprada,
m.valor as vlrUnitario,
(m.valor * m.quantidade) as valorCompra,
0 as vlrAberto,
v.valor as vlrFechado,
v.data as data
FROM
movimento_indices m
LEFT JOIN indices i ON i.idindice = m.idindice
LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
v.hora IN ('18:00')
EDIT
This is what I get
This is the expected result
Advertisement
Answer
I think that you want conditional aggregation here:
SELECT
i.descricao as cotacao,
m.quantidade as qtdComprada,
m.valor as vlrUnitario,
(m.valor * m.quantidade) as valorCompra,
MAX(CASE WHEN v.hora = '08:00' THEN v.valor END) as vlrAberto,
MAX(CASE WHEN v.hora = '18:00' THEN v.valor END) as vlrFechado,
v.data as data
FROM
movimento_indices m
LEFT JOIN indices i ON i.idindice = m.idindice
LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE v.hora IN ('08:00', '18:00')
GROUP BY
i.descricao,
m.quantidade,
m.valor,
m.quantidade,
v.data
Another option is a lateral join:
SELECT
i.descricao as cotacao,
m.quantidade as qtdComprada,
m.valor as vlrUnitario,
(m.valor * m.quantidade) as valorCompra,
v.vlrAberto,
v.vlrFechado,
v.data as data
FROM
movimento_indices m
LEFT JOIN indices i ON i.idindice = m.idindice
LEFT LATERAL JOIN (
SELECT
MAX(v.valor) FILTER(WHERE v.hora = '08:00') as vlrAberto,
MAX(v.valor) FILTER(WHERE v.hora = '18:00') as vlrFechado,
v.data
FROM valores_indices v
WHERE v.idindice = m.idindice AND v.hora IN ('08:00', '18:00')
GROUP BY v.data
) v ON 1 = 1