Синтаксис SQL - Группировать по ... Пользовательские агрегатные функции? - PullRequest
1 голос
/ 24 июня 2009

У меня такая ситуация:

Таблица: 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 лет. Я хочу выбрать цену, которая будет эффективной либо сегодня, либо в прошлом (не в будущем! Пока не действует). Это должна быть «самая последняя» эффективная цена.

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 24 июня 2009

Примерно так (не называйте своих имен, но вы поняли) ...

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
2 голосов
/ 24 июня 2009
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; 

Изменить: изменение запроса на фактическую работу при условии, что цена меняется не чаще одного раза в день.

0 голосов
/ 24 июня 2009

должно работать, если вы делаете

SELECT ItemName, MAX(ItemPriceEffectiveDate)
FROM FunTable
WHERE ItemPriceEffectiveDate < getDate()
GROUP BY ItemName
0 голосов
/ 24 июня 2009

Я не знаю ответа от головы, но я предполагаю, что вы имеете в виду необходимость использовать подзапрос, что может сделать его очень дорогим запросом.

Может быть проще извлечь все данные из кода использования для последующей обработки самостоятельно.

...