Главная страница
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.014 c
14-69513
Дельфист замученный билдером
2002-11-02 12:24
2002.11.21
Проклятый билдер


4-69650
SergeBSL
2002-10-09 23:35
2002.11.21
Как переместить курсор в Edit-е чтобы выделенная часть не пропала


1-69240
Александр
2002-11-11 16:07
2002.11.21
обучение (курсы) Delphi


6-69468
Azbul
2002-09-26 10:33
2002.11.21
как програмно сделать чтобы народ в инет ходит не мог?


1-69263
iguana
2002-11-11 20:10
2002.11.21
ламерский вопрос