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

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

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

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

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
18.04.2019, 18:23
    #39803563
IgorL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
Dimitry Sibiryakov,

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

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

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

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

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

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

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

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

Код: 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
19.04.2019, 12:41
    #39803910
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
Код: 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
19.04.2019, 19:10
    #39804094
IgorL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста идеей как сделать в Firebird (Диалект 1)
WildSeryIgorL,

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


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