Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.007 c
1-69295
dimonf
2002-11-12 12:24
2002.11.21
Как отследить нахождение курсора над моим Edit-ом?


3-69099
Fast
2002-11-02 11:22
2002.11.21
TClientDataSet + SQL


1-69256
Snap
2002-11-09 21:08
2002.11.21
позиционно независимый код


1-69251
Shluz
2002-11-11 19:38
2002.11.21
SMS средствами E-mail


6-69473
IronHawk
2002-09-25 23:18
2002.11.21
Передача данных потоком по сети ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский