Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Простой вопрос


Автор: Petro123 14.5.2007, 16:45
Есть табличка, Например
    Date          Sale
  1.01.2007       10
  3.01.2007       7
 10.01.2007      13
 11.01.2007      10
 20.01.2007      16
 25.01.2007      19

Дана дата(параметр). Нужно выбрать последнюю Sale до этой дата.

Select max(t.Date) From t where t.Date<=дата

Нашли макс дату до дата, а какой у нее Sale.
Есть ли еще какая нибудь групповая функция типа Last или ...?
Не хочется делать вложенный запрос, как можно решить задачу проще?

Автор: Sqlninja 14.5.2007, 17:02
Код

Select max(t.Date), t.sale From t where t.Date<=дата group by t.sale


Или я чтото не так понял?

Автор: Petro123 15.5.2007, 12:51
Наверное не так, ...
Зачем группировать по цене?
Задачу можно решить с использованием аналитических функций, просто хотелось узнать, как решают такую задачу другие...
 

Автор: TicTak 15.5.2007, 14:58
Цитата(Petro123 @  15.5.2007,  14:51 Найти цитируемый пост)
Зачем группировать по цене?

max -  функция агрегированния данных, поэтому всё что не обёрнуто в функции агрегирования должно быть сгрупировано.

Цитата(Petro123 @  15.5.2007,  14:51 Найти цитируемый пост)
Задачу можно решить с использованием аналитических функций, просто хотелось узнать, как решают такую задачу другие...

Зачем? Так намоного проще. И потом, если ты будеш использовать max(t.Date), то ты не сможеш использовать аналитику, т.к. она не групируется. Прийдётся оборочивать в внешний запрос ещё, чтоб сгрупировать.

Цитата(Petro123 @  14.5.2007,  18:45 Найти цитируемый пост)
Дана дата(параметр). Нужно выбрать последнюю Sale до этой дата.


Если писать через аналитику, то у тебя будет 6 дат, так как у тебя 6 строк данных. 

Автор: Petro123 18.5.2007, 13:37
Цитата

max -  функция агрегированния данных, поэтому всё что не обёрнуто в функции агрегирования должно быть сгрупировано.

Я прекрасно понимаю, как работает функция МАХ, вопрос не в этом
Цитата

Зачем? Так намоного проще. И потом, если ты будеш использовать max(t.Date), то ты не сможеш использовать аналитику, т.к. она не групируется. Прийдётся оборочивать в внешний запрос ещё, чтоб сгрупировать.

По всей видимости ты не понял вопроса... Приведи пример... Ничего оборачивать не надо...

Цитата

Если писать через аналитику, то у тебя будет 6 дат, так как у тебя 6 строк данных.

Я тебя вообще не понимаю...

Добавлено через 1 минуту и 27 секунд
Цитата

Так намоного проще. 

И вобще, ты утверждаешь, что запрос приведенный выше правильный?!
Он вообще не верен в рамках данной темы!

Автор: TicTak 18.5.2007, 15:14
Цитата(Petro123 @  18.5.2007,  15:37 Найти цитируемый пост)
Он вообще не верен в рамках данной темы!


Какой результат должен быть в приведённых тобой данных?

Автор: Petro123 18.5.2007, 15:52
Например Дата = 23.01.2007 

Результат  23.01.2007  16
Я говорю аналитические функции позволяют решить без вопрос без группировки данных

Автор: TicTak 21.5.2007, 09:59
Код

SELECT :on_date, tt.sale
  FROM (SELECT   t.date,  t.sale, ROW_NUMBER () OVER (ORDER BY  t.date DESC) n
            FROM t
           WHERE  t.date <= :on_date
        ORDER BY  t.date) tt
 WHERE tt.n = 1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)