Sintaxe SQL - Grupo por… funcionalidade agregada personalizada?
-
10-07-2019 - |
Pergunta
Eu tenho uma situação como esta:
Tabela: FUNTABLE
ItemKey ItemName ItemPriceEffectiveDate ItemPrice
11 ItemA 6/6/2009 $500
12 ItemA 6/15/2009 $550
13 ItemA 9/9/2009 $450
14 ItemB 3/9/2009 $150
15 ItemB 9/9/2009 $350
Eu preciso fazer o seguinte:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
A saída deve ser a seguinte:
ItemA $550
ItemB $150
Portanto, as datas eficazes para preços podem variar de 5 anos a 5 anos daqui a. Quero selecionar o preço efetivo hoje ou no passado (não no futuro! Ainda não é eficaz). Tem que ser o preço efetivo "mais recente".
Alguma ideia?
Solução
Algo assim (não tem seus nomes, mas você entendeu) ...
WITH A (Row, Price) AS
(
SELECT Row_Number() OVER (PARTITION BY Item ORDER BY Effective DESC) AS [RN],
Price FROM Table2
WHERE Effective <= GETDATE()
)
SELECT * FROM A WHERE A.Row = 1
Outras dicas
select ft.ItemName,
price
from (select ItemName,
Max(ItemPriceEffectiveDate) as MaxEff
from FunTable
where ItemPriceEffectiveDate <= GETDATE()
group by ItemName) as d,
FunTable as ft
where d.MaxEff = ft.ItemPriceEffectiveDate;
Editar: mudou a consulta para realmente funcionar, assumindo que o preço não mude mais de uma vez por dia.
Não sei a resposta no topo da minha cabeça, mas meu palpite é que você quer dizer precisar usar uma sub-quadra, o que pode torná-la uma consulta muito cara.
Pode ser mais fácil puxar todos os dados em um código de uso para pós-processá-los.
deve trabalhar se você fizer
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName