Форум: "Базы";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Вниз2000 Помогите с запросом. Найти похожие ветки
← →
KAA (2002-10-30 21:24) [0]Есть таблица проживания:
1 FIO varchar ФИО жильца
2 Num int номер комнаты
3 CountPlace int кол-во мест занимаемых жильцом
4 DTIn datetime момент поселения
5 DTOut datetime момент выселения
и правочник номеров, соединенный по полю Num
1 Num int номер комнаты
2 MaxCountPlace int кол-во мест в комнате
В разные моменты времени разные жильцы могут занимать произвольное количество мест (один жилец может занимать несколько мест). В любой момент времени в комнате жильцы в своей сумме занимают места не более чем максимальное количество мест в номере.
Задача: Как узнать максимальное количество занятых мест в течении заданного промежутка времени?
← →
ЮЮ (2002-10-31 03:33) [1]Вряд ли это задача для SQL, т.к здесь не поможет групповая операция, а нужно сканирование НД.
Выбери все записи изменения кол-ва проживающих в комнате за период:
Select * from
(select Num,CountPlace,DtIn Dt where not (DtOut<:From or DtIn>:To)
union
select Num,-CountPlace,DtOut Dt where not (DtOut<:From or DtIn>:To)
) changes order by num, Dt
А теперь пробеги по НД и для каждого Num прибавляй CountPlace, запоминая максимальное значение.
← →
mvg_first (2002-10-31 10:23) [2]Т.е. из условия получается что если в номере 5 мест и в нем живет 1 человек, то он занимает все 5 мест?
Или может когда он въехал в номер он занял 2 места и занимает их пока не выедет?
Или в течении временеи между DTIn и DTOut значение поля CountPlace может менятся? тогда в таблице нахватает одного поля.
По которому определять в какой момент времени каждый жилец занимает сколько места.
← →
KAA (2002-10-31 11:20) [3]По условию любой человек может поселиться не на одно место, а сразу на несколько.
Т.е. если человек поселился на 2 места, в таблице для него будет одна запись с CountPlace=2, и меняться это значение не будет.
← →
ЮЮ (2002-10-31 11:42) [4]>Задача: Как узнать максимальное количество занятых мест в течении заданного промежутка времени?
Я же написал, что данная задача не решается одним SQL запросом
ЮЮ © (31.10.02 03:33)
Док-во: Пусть имеем прецедент, когда в день Dt в комнате Num заполнены все места. Т.е.
F(dt,dt) = MaxCountPlace;
Тогда для любого dt1<dt и dt>dt
F(dt1,dt2) = MaxCountPlace,
т.е. мы должны получать один и тот же результат на выборках различной длины, что явно говорит о том, что такая ф-ция не может быть реализована на языке SQL
← →
Johnmen (2002-10-31 11:50) [5]Проходишь цикл по всем датам (<Дата_1>...<Дата_N>) из заданного промежутка времени,
для каждой даты выполняешь
SELECT SUM(CountPlace) AS SumOfCountPlace FROM Table
WHERE <Дата_i> BETWEEN DTIn AND DTOut
и определяешь по ходу дела макс. SumOfCountPlace.
После отработки цикла имеешь ответ на свой вопрос...
Организовать цикл в приложении или в ХП - дело лично твое, но я бы сделал ХП...
← →
mvg_first (2002-10-31 11:58) [6]Ну тогда
DataZap = Дата на которую нужно получить общее количество занятых мест
Запрос
select SUM(CountPlase)
from TabPROJ
WHERE DTIn <= :DataZap and DtOut >= :DataZap
Такой запрос не подойдет
← →
ЮЮ (2002-10-31 12:03) [7]mvg_first © (31.10.02 11:58)
Это на текущую дату (уж это-то он, наверное, и сам сделал), а человека интересует за период
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c