Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

2000 Помогите с запросом. [MSSQL]


KAA ©   (2002-10-30 21:24:00) 

Есть таблица проживания:
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 12:03:00) [1]

mvg_first © (31.10.02 11:58)
Это на текущую дату (уж это-то он, наверное, и сам сделал), а человека интересует за период


mvg_first   (2002-10-31 11:58:00) [2]

Ну тогда
DataZap = Дата на которую нужно получить общее количество занятых мест
Запрос
select SUM(CountPlase)
from TabPROJ
WHERE DTIn <= :DataZap and DtOut >= :DataZap

Такой запрос не подойдет


Johnmen   (2002-10-31 11:50:00) [3]

Проходишь цикл по всем датам (<Дата_1>...<Дата_N>) из заданного промежутка времени,
для каждой даты выполняешь
SELECT SUM(CountPlace) AS SumOfCountPlace FROM Table
WHERE <Дата_i> BETWEEN DTIn AND DTOut
и определяешь по ходу дела макс. SumOfCountPlace.
После отработки цикла имеешь ответ на свой вопрос...
Организовать цикл в приложении или в ХП - дело лично твое, но я бы сделал ХП...


ЮЮ   (2002-10-31 11:42:00) [4]

>Задача: Как узнать максимальное количество занятых мест в течении заданного промежутка времени?

Я же написал, что данная задача не решается одним SQL запросом
ЮЮ © (31.10.02 03:33)
Док-во: Пусть имеем прецедент, когда в день Dt в комнате Num заполнены все места. Т.е.
F(dt,dt) = MaxCountPlace;
Тогда для любого dt1<dt и dt>dt
F(dt1,dt2) = MaxCountPlace,
т.е. мы должны получать один и тот же результат на выборках различной длины, что явно говорит о том, что такая ф-ция не может быть реализована на языке SQL


KAA   (2002-10-31 11:20:00) [5]

По условию любой человек может поселиться не на одно место, а сразу на несколько.
Т.е. если человек поселился на 2 места, в таблице для него будет одна запись с CountPlace=2, и меняться это значение не будет.


mvg_first   (2002-10-31 10:23:00) [6]

Т.е. из условия получается что если в номере 5 мест и в нем живет 1 человек, то он занимает все 5 мест?
Или может когда он въехал в номер он занял 2 места и занимает их пока не выедет?
Или в течении временеи между DTIn и DTOut значение поля CountPlace может менятся? тогда в таблице нахватает одного поля.
По которому определять в какой момент времени каждый жилец занимает сколько места.


ЮЮ   (2002-10-31 03:33:00) [7]

Вряд ли это задача для 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, запоминая максимальное значение.



Наверх

Титульная страница Поиск, карта сайта Написать письмо