Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > SQL запрос с проверкой


Автор: Snowy 6.4.2005, 15:44
Есть таблица (log-файл)
структура: 2 поля - дата и текс.
DATE, TEXT
Нужно показать все записи
SELECT * FROM LOG;
но есть одно ограничение. За каждую дату есть несколько таких записей.
Показывать нужно только одну из них. То есть одни сутки - одна строка.
Как мне осуществить проверку, что в следующей строке дата равна текущей?
Пример
01.04.2005 тра-та-та
01.04.2005 три рубля
02.04.2005 куку-руку
02.04.2005 бла-бла

Получить нужно
01.04.2005 тра-та-та
02.04.2005 куку-руку
или
01.04.2005 три рубля
02.04.2005 бла-бла

Не должно быть дублирование суток.

Автор: Mal Hack 6.4.2005, 15:45
GROUP BY `date`

Автор: Snowy 6.4.2005, 15:47
В догонку. А как определить, что после текущей записи дата не +1, а +2 или больше.

Автор: Mal Hack 6.4.2005, 15:52
Цитата(Snowy @ 6.4.2005, 16:47)
В догонку. А как определить, что после текущей записи дата не +1, а +2 или больше.

Разницу между датами в записях?
ИМХО, это уже не на уровне СУБД придется делать.

Автор: Snowy 6.4.2005, 15:57
Нет, не разница между датами.
Например
SELECT DATE,DATE+1 FROM LOG;
мне вернет
01.04.2005 02.04.2005
Допустим я хочу добавить на выходе еще колонку, гле будет ставиться флаг того, что после данной строки есть пробел в датах.
Могу я как-то обратиться в своем запросе для проверки следующей по порядку строки?
Если DATE следующей строки не равно DATEтекущей+1, то в третий столбец выставить флаг.

Автор: Петрович 6.4.2005, 19:08
Цитата(Snowy @ 6.4.2005, 16:57)
Могу я как-то обратиться в своем запросе для проверки следующей по порядку строки?

Возможно это можно описать с помощью вложенных SELECT. Но, я думаю что это будет очень не эффективно. Я бы сделал это на уровне программы. Хотя, ... Может есть и другие решения.

Автор: Snowy 6.4.2005, 20:31
Вложенные селекты это не очень эффективно для большой базы.
Я и сам могу сложить селект на селекте. Но хотелось бы что-то пограмотнее.
Просто до этого работал не с реляционными базами.
Получить такой запрос в привычной мне системе это дело 2-х секунд.
Поэтому при работе с SQL у меня возникает нездоровый вопрос% неужели в одном SELECT запросе я не могу обратиться для проверки поля следующего за проверяемым.
Решение крутится на кончике языка, и я уверен, что это просто. Но мои знания SQL на уровне основных стандартов. Но я не верю, что на SQL невозможно реализовать такое простое решение.
Всего-то нужно проверить запись следующюю за current.
Неужели SQL недостаточно мощное средство для этого.
Я не верю.

Автор: Петрович 6.4.2005, 21:25
Увы, придется поверить. SQL орентирован на реляционные отношения, а там нет понятий "следующий", "предыдущий", "текущий", и т.п.

Автор: Mal Hack 6.4.2005, 21:32
Цитата(Snowy @ 6.4.2005, 21:31)
Неужели SQL недостаточно мощное средство для этого.

Тут весь камень приткновения в том, что этот флаг ты должен установить в начале запроса, т.е. SELECT ..... FROM... А сортировка делается только уже после выборки... Т.е. к результатам отсортированным в запросе ты обратиться не можешь. разве что на некоторых СУБД через вложенные процедуры можно реализовать. Ты с чем работаешь?

Автор: Snowy 7.4.2005, 06:52
Цитата(Mal @ 6.4.2005, 21:32)
А сортировка делается только уже после выборки

У меня база и так отсортирована. Сортируй не сортируй... Порядок остается прежним.

Цитата(Mal @ 6.4.2005, 21:32)
Ты с чем работаешь?

Oracle8

Не хочется использовать вложенный селект.
Но попробую хоть в эту сторону.

Автор: igon 7.4.2005, 13:14
Используй Self Join
Для таблицы
Код


  Test (DATEOF Date)

такой запрос
Код

select a.dateof CurrentDate, b.dateof NextDate
  from test A Left Outer Join test B 
                On a.dateof+1 = b.dateof
  Order By CurrentDate

покажет в поле NextDate dateof+1 только для тех записей, у которых она существует. Для остальных - Null. Чем не флаг? smile
Проверял на 9i

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