powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
17 сообщений из 17, страница 1 из 1
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803532
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть табличка в которой навалены отметки с идентификаторами входа и выхода.
Каждое событие отдельная строка, вход это или выход нужно понимать по перечню считывателей, через которые вошел или вышел.
Задача - посчитать сколько человек в офисе в любой момент времени. Мысль сгруппировать по ID людей и вычесть из суммы входов сумму выходов разбивается об отсутствие временных таблиц в этой версии FB, математика в виде "суммы разности сумм" в одном запросе что то не получается, не силен я в этой СУБД.
Подкиньте плз. идею, как посчитать можно.
Спасибо!
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803537
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.04.2019 17:46, IgorL пишет:
> Есть табличка в которой навалены отметки с идентификаторами входа и выхода.
> Каждое событие отдельная строка, вход это или выход нужно понимать по перечню считывателей, через которые вошел или вышел.
> Задача - посчитать сколько человек в офисе в любой момент времени. Мысль сгруппировать по ID людей и вычесть из суммы входов сумму выходов разбивается об отсутствие временных таблиц в этой версии FB,
> математика в виде "суммы разности сумм" в одном запросе что то не получается, не силен я в этой СУБД.
> Подкиньте плз. идею, как посчитать можно.
> Спасибо!

покажи пример данных.
а то не понятно.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803545
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorLЗадача - посчитать сколько человек в офисе в любой момент времени.

Количество людей есть интеграл входов-выходов от минус бесконечности до данного момента
времени. SUM() тебе в руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803558
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, примерно так:

DateTimeEventRd_IDCl_ID18.04.2019 8:12132218.04.2019 10:26162218.04.2019 10:411452218.04.2019 10:52162218.04.2019 10:551452218.04.2019 11:231342218.04.2019 11:231712218.04.2019 11:270342218.04.2019 11:281451118.04.2019 11:551711118.04.2019 12:040631118.04.2019 12:04131118.04.2019 12:061451118.04.2019 12:47161118.04.2019 15:281451118.04.2019 14:231341118.04.2019 14:260341118.04.2019 15:451451118.04.2019 15:270631118.04.2019 15:2502511
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803563
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

авторКоличество людей есть интеграл входов-выходов от минус бесконечности до данного момента
времени. SUM() тебе в руки.
Интеграл? Мне видится проще, количество входов минус количество выходов сгруппированных по Cl_ID дают единице если человек в офисе и ноль если его нет. Отрицательные значения и больше одного это значит он проходил с кем то. Отдельная тема для разборки.
Сумма по людям дает количество в офисе. Никак не соображу как это в один запрос умять. :( Сделал бы с временной табличкой (да, некрасиво, знаю) но их нет у FB1.
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803569
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
18.04.2019 18:14, IgorL пишет:
> Мимопроходящий, примерно так:
> DateTime Event Rd_ID Cl_ID

что означают эти поля?
(кроме DateTime)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803686
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

в поле Event пишется тип события, 0 выход, 1 вход. Rd_ID это контроллер, может быть только входа, считыватель на выходе из тогда будет подключен к другому контроллеру, только выход. Это не так важно, важно что из пары Rd_ID и Event однозначно собирается для
Cl_ID (уникальный идентификатор входящего) куда он проходил, в или из помещения.
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803734
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это реальная задача или лабораторная работа?
Все эти расчёты - полная чепуха. Даже человек не может проанализировать все повторные отметки и входы-выходы, когда "дверь подержали".
У нас приезжает автобус с сотрудниками - на КПП они все отмечаются, поскольку за "опоздание" оштрафовать могут, но вот в офис - это первый открыл, и вся толпа вошла.

Такая система может работать в одном единственном случае - либо охранник возле дверей, не дающий пересекать без отметки каждого, либо дверь должна быть такой:
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803819
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryЭто реальная задача или лабораторная работа?
Все эти расчёты - полная чепуха. Даже человек не может проанализировать все повторные отметки и входы-выходы, когда "дверь подержали".
У нас приезжает автобус с сотрудниками - на КПП они все отмечаются, поскольку за "опоздание" оштрафовать могут, но вот в офис - это первый открыл, и вся толпа вошла.

Такая система может работать в одном единственном случае - либо охранник возле дверей, не дающий пересекать без отметки каждого, либо дверь должна быть такой:....
Это реальная задача. КПП нет, отмечаются при входе и при выходе в офис. Дверей несколько, на каждой стоят контроллеры, на вход и на выход.
Отмечаются весьма тщательно так как нет отметки о входе - автоматом не был на работе. Нет отметки о выходе - автоматом работал всего час или до первой отметки выхода в этот день.
В конце месяца список с проблемами отметок направляют работникам, они идут в СБ просить просмотреть видео за эти дни и проставить вход/выход по камерам. В общем это хлопотно, частые обращения чреваты оргвыводами, старички отмечаются как часы, новички после пары "пролетов" тоже прикладывают тщательно.

Проблема в том, что система учета похожа на лютый самопис неизвестного автора на Delphi+Fb затертого года. К тому же непонятно кем и когда установленная, нумерация контроллеров и их логика нелинейная, трудновычислимая. На MSSQL курсром и/или временными табличками без проблем, на FB что то не идет мысль. Нужно понять есть ли после последнего входа выход по каждому, провернув это по всем событиям за сегодня. Как то так.
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803840
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
версия FB ?
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803859
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorL,

Судя по вашему описанию, обязательна только отметка на вход и выход, да и то, из-за излишней старательности, могут по 2 раза отметиться. Значит, следует как минимум удалять дубли отметок.
Если на обед ходят за пределы контролируемого пространства (необходимо выйти, а потом опять зайти), то всё опять плохо.
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803876
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorLв поле Event пишется тип события, 0 выход, 1 вход.
кто вот это придумал.... Вход это 1, выход это -1, тогда хоть арифметические операции над событиями можно делать, допустим sum.
В результате - null, не входил, 0 - вошел и вышел, 1 - не вышел, и т.д.
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803882
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, это неважно есть case
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803894
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorLМне видится проще, количество входов минус количество выходов сгруппированных по Cl_ID
дают единице если человек в офисе и ноль если его нет. Отрицательные значения и больше
одного это значит он проходил с кем то. Отдельная тема для разборки.
Сумма по людям дает количество в офисе.

Это и есть интеграл входов-выходов в конечном итоге. Только в обход. Тебе же нужно только
количество людей в офисе, а не поимённый список, не так ли?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803906
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, надоело мне, вот готовый запрос, который выведет количество людей, вошедших, но не
вышедших после этого на заданный момент времени. Пользуйся, аффтар.

Код: sql
1.
2.
3.
4.
5.
6.
select count(distinct cl_id) from t t1 where DateTime < Заданный_момент_времени
  and Event = 1
  and not exists(select * from t t2 where t2.DateTime < Заданный_момент_времени
       and t2.DateTime > t1.DateTime
       and Event = 0
       and t1.cl_id = t2.cl_id)


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39803910
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select SM.SUMM, count(*)
from (select
        "Rd_ID",
        sum(iif("Event" = 0, -1, 1)) as SUMM
      from TABLENAME
      where "DateTime" between :FROM and :TO
      group by "Rd_ID") as SM
group by SM.SUMM


FROM - время когда в офисе гарантированно никого нет,
TO - момент времени, на который нужны данные
...
Рейтинг: 0 / 0
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
    #39804094
IgorL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryIgorL,

Судя по вашему описанию, обязательна только отметка на вход и выход, да и то, из-за излишней старательности, могут по 2 раза отметиться. Значит, следует как минимум удалять дубли отметок.
Если на обед ходят за пределы контролируемого пространства (необходимо выйти, а потом опять зайти), то всё опять плохо.
Да, это если суммировать количество входов и вычитать из них количество выходов. Действительно возникает рассинхрон.
Дубли удалять не нужно, логически если максимальное время входа больше максимального времени выхода, то работник внутри. Если наоборот, то он вышел. Хуже другое, считыватели подключены на разные линии/контроллеры по асинхронным протоколам, как выяснилось довольно медленным. Это сбивает в случаях если зашел и тут же вышел. Или вышел, но тут же вернулся.
Спасибо всем за идеи, пока накидал в Lazarus два DS с вычислением максимального времени входа и выхода каждого и связал по Cl_ID. Получилось достаточно точно, но не гарантированно. :( По причине вышеописанных "родовых" болячек системы.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]