Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
1-69385
s_karm
2002-11-10 12:13
2002.11.21
инсталяция


3-69121
Sergant
2002-10-31 14:55
2002.11.21
Работа с структурой БД в формате dbf


1-69317
iguana
2002-11-12 15:05
2002.11.21
StayOnTop


1-69271
MAXL
2002-11-09 17:24
2002.11.21
Помогите написать прогу, которая отсеивает шумы и помехи TV-FM-Tu


1-69425
AndreyAG
2002-11-11 11:00
2002.11.21
Окна!