| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > 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, 15:57 |
| Нет, не разница между датами. Например SELECT DATE,DATE+1 FROM LOG; мне вернет 01.04.2005 02.04.2005 Допустим я хочу добавить на выходе еще колонку, гле будет ставиться флаг того, что после данной строки есть пробел в датах. Могу я как-то обратиться в своем запросе для проверки следующей по порядку строки? Если DATE следующей строки не равно DATEтекущей+1, то в третий столбец выставить флаг. |
| Автор: Петрович 6.4.2005, 19:08 | ||
Возможно это можно описать с помощью вложенных 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 | ||
Тут весь камень приткновения в том, что этот флаг ты должен установить в начале запроса, т.е. SELECT ..... FROM... А сортировка делается только уже после выборки... Т.е. к результатам отсортированным в запросе ты обратиться не можешь. разве что на некоторых СУБД через вложенные процедуры можно реализовать. Ты с чем работаешь? |
| Автор: Snowy 7.4.2005, 06:52 | ||||
У меня база и так отсортирована. Сортируй не сортируй... Порядок остается прежним.
Oracle8 Не хочется использовать вложенный селект. Но попробую хоть в эту сторону. |
| Автор: igon 7.4.2005, 13:14 | ||||
| Используй Self Join Для таблицы
такой запрос
покажет в поле NextDate dateof+1 только для тех записей, у которых она существует. Для остальных - Null. Чем не флаг? Проверял на 9i |