SQL -Syntax - Gruppe von… benutzerdefinierten Aggregatfunktionalität?
-
10-07-2019 - |
Frage
Ich habe eine Situation wie diese:
Tabelle: 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
Ich muss Folgendes tun:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
Die Ausgabe sollte Folgendes sein:
ItemA $550
ItemB $150
Daher können effektive Daten für die Preise von vor 5 Jahren bis 5 Jahre reichen. Ich möchte den Preis auswählen, der heute oder in der Vergangenheit wirksam ist (nicht in Zukunft! Es ist noch nicht effektiv). Es muss der "neueste" effektive Preis sein.
Irgendwelche Gedanken?
Lösung
So etwas (habe keine Namen, aber du bekommst die Idee) ...
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
Andere Tipps
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;
Bearbeiten: Ändern Sie die Abfrage in die Arbeit, vorausgesetzt, der Preis ändert sich nicht mehr als einmal am Tag.
Ich kenne die Antwort nicht von der Spitze meines Kopfes, aber ich vermute, dass Sie meinen, ein Unterbild zu verwenden, was es zu einer sehr teuren Anfrage machen könnte.
Es kann einfacher sein, alle Daten in einem Verwendungscode zu ziehen, um sie selbst zu verarbeiten.
sollte funktionieren, wenn Sie dies tun
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName