непростой SQL запрос @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 8 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Заголовок сообщения: непростой SQL запрос
Сообщение Добавлено: 30 Сентябрь 2003, 14:44:21 
Кто сумеет написать SQL запрос для следующей задачи ?

Таблица test
Код:
 id   |  s  |  t
------------------
 1      1     1
 2      2     1
 3      1     6
 4      3     5
 5      1     20
 6      4     1
 7      3     10
 8      2     6


Нужно получить результат

Код:
 s   |   count(s)
------------------
 2        2
 3        2

Таблицу, в которой подсчитывается количество различных s, у которых ближайшие значения поля t отстоят не более чем на 7.

Т.е. s = 2 и s = 3. Для s=1 не выполняется условие, поскольку 20 - 6 > 7. Для s = 4 - не выполняется условие появления более 1 раза

желательно, чтобы SQL запрос проходил на mySQL и PostgreSQL.

Спасибо.[/code]
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 30 Сентябрь 2003, 15:56:18 
gregzem, что есть "ближайшие значения полей"?

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Сообщение Добавлено: 1 Октябрь 2003, 08:48:13 
если отсортировать таблицу test по полю t и s (результат ниже):

Код:
id   |  s  |  t
------------------
1      1     1
3      1     6
5      1     20
2      2     1
8      2     6
4      3     5
7      3     10
6      4     1


то для s=1 ближайшие поля будут 1,6 и 6,20
для s=2 - соответсвенно 1 и 6
для s=3 - это 5 и 10
для s=4 - одно поле, поэтому это значение нужно сразу отсеивать

Возвращаясь к задаче, нужно найти количество различных s, у которых разность ближайших элементов всегда меньше или равное 7.

Т.е. для s=1 необходимо просмотреть разности 6-1 и 20-6. Поскольку вторая разность больше 7, s=1 - отсеивается.

Нужно написать SQL запрос.

Вчера я написал запрос, который отображает количество отсеянных решений (решил обратную задачу), но хотелось бы решить прямую (с глубиной подзапросов не более 2).
<sergio.ga>
новый человек
0
Сообщения: 102
Зарегистрирован: 13.06.03
Откуда: Харьков, Украина
Заголовок сообщения: Re: непростой SQL запрос
Сообщение Добавлено: 1 Октябрь 2003, 10:13:57 
Одним запросом никак не могу сделать.
Пока получилось следующее:
Код:
CREATE TEMPORARY TABLE tmp
     SELECT t1.id, t1.s, t1.t, MIN(t2.t) AS t2
        FROM test t1
INNER JOIN test t2
            ON t1.s = t2.s && t1.t < t2.t && (t2.t - t1.t) <= 7
GROUP  BY t1.t
ORDER  BY t1.s, t1.t

Запрос формирует временную таблицу формата:
id | s | t | t2
где t2 - "ближайшее поле"
в таблице присутствуют только записи с расстоянием между t и t2 <= 7
Остаётся только посчитать:
Код:
SELECT COUNT(id) AS num FROM tmp GROUP BY s

В MySQL АФАИК вложенных запросов нет.
Может кто додумает до одного.

P.S. ORDER BY - для наглядности, в рабочей версии не нужны, естественно.
Original Demon Муж.
постоянный участник
9
Сообщения: 2719
Зарегистрирован: 18.04.02
Откуда: Hell of a Place
Сообщение Добавлено: 1 Октябрь 2003, 10:32:18 
а и не надо такие вещи запросами делать. это суть бизнес логика и нечего ей делать в уровне данных. скрипты.

_________________
Original Demon - distributed world wide since 546 BC
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 1 Октябрь 2003, 10:55:30 
Original Demon, не согласен по поводу уровня. скорее это как раз уровень бизнес-логики. по вопросу - пара дней размышлений привела к выводу похожему на предложенное <sergio.ga> - только двумя запросами.

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Сообщение Добавлено: 1 Октябрь 2003, 13:58:56 
Спасибо. Буду думать дальше.
gregzem Муж.
новый человек
2
Сообщения: 252
Зарегистрирован: 29.04.03
Заголовок сообщения: Re: непростой SQL запрос
Сообщение Добавлено: 2 Октябрь 2003, 16:39:58 

<sergio.ga> писал(а):
Запрос формирует временную таблицу формата:
id | s | t | t2
где t2 - "ближайшее поле"
в таблице присутствуют только записи с расстоянием между t и t2 <= 7
Остаётся только посчитать...



ИМХО неправильно. Нужно чтобы временная таблица включала только те s, у которых ВСЕ ближайшие t2-t <=7, а она включает и те s, у которых хотя бы одна пара t2-t <= 7.

В таблицу нужно заносить только те s, у которых разность между каждой соседней парой <= 7. Если есть хотя бы одна пара t2 и t (соседних) у которых t2-t > 7 - не брать ни одной строки для текущей s.
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 8 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100