Синтаксис SQL & # 8212; Группировать по & # 8230; Пользовательская совокупная функциональность?
-
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;
Изменить. Изменен запрос на фактическую работу, при условии, что цена меняется не чаще одного раза в день.
Я не знаю ответа от головы до головы, но я предполагаю, что вы имеете в виду необходимость использовать подзапрос, что может сделать его очень дорогим запросом.
Может быть проще извлечь все данные в коде использования для последующей обработки самостоятельно.
должен работать, если вы делаете
SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName