Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.016 c
3-69098
Sers
2002-11-02 10:34
2002.11.21
select * from Table - не работает


14-69537
vidiv
2002-11-01 14:16
2002.11.21
Осторожно! Linux!


1-69283
_Nicola_
2002-11-12 09:48
2002.11.21
Assign или :=


4-69633
DeCompiler
2002-10-10 18:51
2002.11.21
Цвет пикселя в закрытой части окна


14-69500
delpher_gray
2002-10-31 19:29
2002.11.21
Как расположить числа в подярке убывания




   Наверх