SQL Syntax - Group بواسطة ... وظائف إجمالية مخصصة؟
-
10-07-2019 - |
سؤال
لدي موقف مثل هذا:
الجدول: 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
أحتاج إلى القيام بما يلي:
Select
ItemName as ItemDescription,
(SELECT THE PRICE WITH THE LATEST EFFECTIVE DATE FROM TODAY THROUGH THE PAST)
FROM
FunTable
GROUP BY
ItemName
يجب أن يكون الإخراج هذا:
ItemA $550
ItemB $150
لذلك ، يمكن أن تتراوح التواريخ الفعالة للأسعار من 5 سنوات إلى 5 سنوات من الآن. أرغب في اختيار السعر الفعال إما اليوم أو في الماضي (ليس في المستقبل! إنه غير فعال بعد). يجب أن يكون السعر الفعال "الأحدث".
أي أفكار؟
المحلول
شيء من هذا القبيل (ليس لديك أسماءك ، لكنك تحصل على الفكرة) ...
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
نصائح أخرى
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;
Edit: Changed the query to actually work, assuming the price does not change more than once a day.
I don't know the answer off the top of my head, but my guess is that you mean need to use a sub-query, which could make it a very expensive query.
It may be easier to pull all the data in an use code to post-process it yourself.
should work if you do
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName
لا تنتمي إلى StackOverflow