Как выбрать одну строку в группе на основе даты? - PullRequest
1 голос
/ 04 августа 2011

У нас есть файл цены товара, который состоит из номера товара, даты вступления в силу цены и цены. У нас будет повышение цен в первом году. Я хочу добавить записи о ценах, которые будут иметь более позднюю дату вступления в силу, и выбрать текущую цену на основе текущей даты. И.Е. Текущая дата 08/03/11, я хочу вытащить запись ITEM1 01.01.09:

1. ITEM1    01/01/01    100.00
2. ITEM1    01/01/05    150.00
3. ITEM1    01/01/09    200.00
4. ITEM1    01/01/12    250.00

Как только наступит первый год - 01.01.12, я выберу запись 01.01.12.

Вы не можете использовать функцию MIN или MAX, так как она вытянет первую или последнюю запись, а не правильную запись.

Любые идеи приветствуются.

Ответы [ 6 ]

4 голосов
/ 04 августа 2011

Попробуйте это:

select * from tb 
join (
        select tb.item, 
        MAX(tb.effDate) effDate
        from tb
        where tb.effDate <= currentDate
        group by tb.item
    ) tmp 
    on tb.item = tmp.item
    and tb.effDate = tmp.effDate

Подзапрос определит правильную строку, а основной запрос снова извлечет строку, чтобы получить цену.

0 голосов
/ 04 августа 2011

Если это просто SQL, вам нужно попробовать

SELECT [columname price] FROM [tablename] WHERE EXTRACT(YEAR FROM CURDATE()) = EXTRACT(YEAR FROM [columname date] ) limit 1

замените [columname] именем колонки, в которой хранятся данные

заменить [tablename] именем таблицы, в которой хранятся данные

Я считаю, что это должно сработать.

0 голосов
/ 04 августа 2011

Если вы используете VB.NET, это может быть очень просто. Похоже, что ваши поля разделены одним '' (пробел). Это даст вам что-то вроде этого:

Dim Record As String = "ITEM1 01/01/01 100.00 ITEM1 01/01/05 150.00 ITEM1 01/01/09 200.00 ITEM1 01/01/12 250.00"
Dim Fields() As String = Record.Split(" ")

Dim LastItemNo As String = Fields(Ubound(Fields) - 2)
Dim LastDate As Date = Date.Parse(Fields(Ubound(Fields) - ))
Dim LastPrice As Single = Val(Fields(Ubound(Fields)))

Debug.WriteLine("Item: " & LastItemNo & "; Date: " & Format(LastDate, "MM-dd-yyyy") & "; $" & Math.Round(LastPrice, 2))

В этом случае будет выведено: Item: Item1; Дата: 01.01.2012; $ 250,00

Надеюсь, это то, что вы искали.

0 голосов
/ 04 августа 2011

Попробуйте это:

SELECT item_number, MAX(price_effective_date)
  FROM items_table
WHERE price_effective_date <  current_date 
    GROUP BY item_number
0 голосов
/ 04 августа 2011

ВЫБРАТЬ * ИЗ таблицы ГДЕ Дата> = '01 / 01/09 '

0 голосов
/ 04 августа 2011

Вы заказываете по дате, в порядке убывания (чтобы последняя запись находилась «сверху»), и используете WHERE, чтобы отфильтровать даты, следующие за датой, которую вы запросили. Предложение LIMIT (в случае mySQL) заставляет результирующий набор иметь только одну строку. Таким образом, запрос будет выглядеть примерно так:

SELECT *
  FROM tab
  WHERE(Number = ITEM1)AND(Date <= CURRENT_DATE)
ORDER BY Date DESC
FETCH FIRST 1 ROW ONLY
...