Sintassi SQL & # 8212; Raggruppa per & # 8230; Funzionalità di aggregazione personalizzata?
-
10-07-2019 - |
Domanda
Ho una situazione come questa:
Tabella: 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
Devo fare quanto segue:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
L'output dovrebbe essere questo:
ItemA $550
ItemB $150
Pertanto, le date di validità dei prezzi possono variare da 5 anni a 5 anni. Voglio selezionare il prezzo che è efficace né oggi né in passato (non in futuro! Non è ancora efficace). Deve essere il "più recente" prezzo effettivo.
Qualche idea?
Soluzione
Qualcosa del genere (non hai i tuoi nomi, ma hai l'idea) ...
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
Altri suggerimenti
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;
Modifica: la query ha cambiato per funzionare davvero, supponendo che il prezzo non cambi più di una volta al giorno.
Non conosco la risposta dalla parte superiore della mia testa, ma la mia ipotesi è che intendi la necessità di utilizzare una query secondaria, che potrebbe renderla una query molto costosa.
Potrebbe essere più semplice estrarre tutti i dati in un codice d'uso per post-elaborarli da soli.
dovrebbe funzionare se lo fai
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName