Syntaxe SQL & # 8212; Grouper par & # 8230; Fonctionnalité d'agrégation personnalisée?
-
10-07-2019 - |
Question
J'ai une situation comme celle-ci:
Tableau: 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
Je dois effectuer les opérations suivantes:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
Le résultat devrait être le suivant:
ItemA $550
ItemB $150
Ainsi, les dates d'entrée en vigueur des prix peuvent aller de 5 ans à 5 ans. Je veux choisir le prix qui est efficace aujourd'hui ou dans le passé (pas dans le futur! Ce n'est pas encore efficace). Ce doit être le "plus récent" prix effectif.
Avez-vous des idées?
La solution
Quelque chose comme ça (vous n'avez pas vos noms, mais vous avez l'idée) ...
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
Autres conseils
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;
Modifier: la requête a été modifiée pour fonctionner, en supposant que le prix ne change pas plus d'une fois par jour.
Je ne connais pas la réponse par cœur, mais je suppose que vous voulez dire qu'il faut utiliser une sous-requête, ce qui pourrait en faire une requête très coûteuse.
Il peut être plus facile d'extraire toutes les données d'un code d'utilisation pour le post-traiter vous-même.
devrait fonctionner si vous le faites
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName