Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL запрос с проверкой, на следующую запись 
:(
    Опции темы
Snowy
Дата 6.4.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Есть таблица (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 бла-бла

Не должно быть дублирование суток.
PM MAIL   Вверх
Mal Hack
Дата 6.4.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



GROUP BY `date`
PM ICQ   Вверх
Snowy
Дата 6.4.2005, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



В догонку. А как определить, что после текущей записи дата не +1, а +2 или больше.
PM MAIL   Вверх
Mal Hack
Дата 6.4.2005, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



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

Разницу между датами в записях?
ИМХО, это уже не на уровне СУБД придется делать.
PM ICQ   Вверх
Snowy
Дата 6.4.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Нет, не разница между датами.
Например
SELECT DATE,DATE+1 FROM LOG;
мне вернет
01.04.2005 02.04.2005
Допустим я хочу добавить на выходе еще колонку, гле будет ставиться флаг того, что после данной строки есть пробел в датах.
Могу я как-то обратиться в своем запросе для проверки следующей по порядку строки?
Если DATE следующей строки не равно DATEтекущей+1, то в третий столбец выставить флаг.
PM MAIL   Вверх
Петрович
Дата 6.4.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



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

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


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Snowy
Дата 6.4.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



Вложенные селекты это не очень эффективно для большой базы.
Я и сам могу сложить селект на селекте. Но хотелось бы что-то пограмотнее.
Просто до этого работал не с реляционными базами.
Получить такой запрос в привычной мне системе это дело 2-х секунд.
Поэтому при работе с SQL у меня возникает нездоровый вопрос% неужели в одном SELECT запросе я не могу обратиться для проверки поля следующего за проверяемым.
Решение крутится на кончике языка, и я уверен, что это просто. Но мои знания SQL на уровне основных стандартов. Но я не верю, что на SQL невозможно реализовать такое простое решение.
Всего-то нужно проверить запись следующюю за current.
Неужели SQL недостаточно мощное средство для этого.
Я не верю.
PM MAIL   Вверх
Петрович
Дата 6.4.2005, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: нет
Всего: 55



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


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Mal Hack
Дата 6.4.2005, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



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

Тут весь камень приткновения в том, что этот флаг ты должен установить в начале запроса, т.е. SELECT ..... FROM... А сортировка делается только уже после выборки... Т.е. к результатам отсортированным в запросе ты обратиться не можешь. разве что на некоторых СУБД через вложенные процедуры можно реализовать. Ты с чем работаешь?
PM ICQ   Вверх
Snowy
Дата 7.4.2005, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: нет
Всего: 484



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

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

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

Oracle8

Не хочется использовать вложенный селект.
Но попробую хоть в эту сторону.
PM MAIL   Вверх
igon
Дата 7.4.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 3
Всего: 21



Используй 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



--------------------
Хотите поговорить об этом?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.