powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
9 сообщений из 9, страница 1 из 1
Помогите с запросом
    #34861558
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
blocks_log
  id_blocks_log      int
  id                     int
  date_add           timestamp
  action               boolean
,
где id-это идентификатор клиента;
date_add - дата добавления задания на блокировку/разблокировку;
action - действие (t-разблокировать, f-заблокировать).
Требуется определить кол-во дней, которые клиент был заблокирован за указанный промежуток времени (месяц). Результат должен выдаваться в виде таблицы:
Код: plaintext
1.
2.
3.
count_work_day
  id                int
  count_day    int
Как это можно реализовать в postgres? Есть ли возможность сделать это одним запросом или несколькими с формированием временных таблиц?
Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите с запросом
    #34861827
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Элементарно делается в один запрос.
...
Рейтинг: 0 / 0
Помогите с запросом
    #34861927
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев СергейЭлементарно делается в один запрос.
Не могу правильно написать (возможно же несколько блокиовок-разблокировок за месяц). Если несложно, приведите пример.
...
Рейтинг: 0 / 0
Помогите с запросом
    #34861985
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserНе могу правильно написать (возможно же несколько блокиовок-разблокировок за месяц). Если несложно, приведите пример.Только после того, как будут приведены презентативные тестовые данные, учитывающие всевозможные варианты включений/отключений.
Ну хотя бы строк 10-15 тестовых данных в разрезе 2-х - 3-х клиентов
...
Рейтинг: 0 / 0
Помогите с запросом
    #34862139
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserЕсть таблица:
Код: plaintext
1.
2.
3.
4.
5.
blocks_log
  id_blocks_log      int
  id                     int
  date_add           timestamp
  action               boolean
,
где id-это идентификатор клиента;
date_add - дата добавления задания на блокировку/разблокировку;
action - действие (t-разблокировать, f-заблокировать).
Требуется определить кол-во дней, которые клиент был заблокирован за указанный промежуток времени (месяц). Результат должен выдаваться в виде таблицы:
Код: plaintext
1.
2.
3.
count_work_day
  id                int
  count_day    int
Как это можно реализовать в postgres? Есть ли возможность сделать это одним запросом или несколькими с формированием временных таблиц?
Заранее спасибо.
Запрос по типу:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT 
    z.id, 
    z.date_add, 
   (SELECT date_add FROM blocks_log bl WHERE (bl.action='t') and (bl.id=z.id) and (bl.date_add>z.date_add) ORDER BY date_add LIMIT  1 )as date_rel
FROM blocks_log z 
WHERE z.action='f'
даст возможность получить дату блокировки и разблокировки в одной записи.
Далее нужно смотреть варианты по типу того как могут пересекаться интервалы (заблокировали до периода/во время периода, разблокировали во время периода/после периода). Обработать NULL-время бликировки/раблокировки (например с помощью COALESCE) И аггрегировать так, как Вам будет угодно.

ЗЫ Это идея, дальше доковыривать - это уже несложно.
...
Рейтинг: 0 / 0
Помогите с запросом
    #34862193
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев Сергей postuserНе могу правильно написать (возможно же несколько блокиовок-разблокировок за месяц). Если несложно, приведите пример.Только после того, как будут приведены презентативные тестовые данные, учитывающие всевозможные варианты включений/отключений.
Ну хотя бы строк 10-15 тестовых данных в разрезе 2-х - 3-х клиентов

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
blocks_log
id_blocks_log         id         date_add               action
 1                               25          2007 - 09 - 11             f
 2                               25          2007 - 10 - 05             t
 3                               25          2007 - 10 - 09             f
 4                               30          2007 - 10 - 05             f
 5                               35          2007 - 10 - 04             t
 6                               35          2007 - 10 - 15             t
 7                               35          2007 - 10 - 25             f  
Код для создания таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE blocks_log (id int,date_add timestamp,action boolean);
INSERT INTO blocks_log (id, date_add, action) VALUES ( 25 ,'2007-09-11','f');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 25  ,'2007-10-05','t');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 25 ,'2007-10-09','f');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 30 ,'2007-10-05','f');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 35 ,'2007-10-04','t');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 35 ,'2007-10-15','t');
INSERT INTO blocks_log (id, date_add, action) VALUES ( 35 ,'2007-10-25','f'); 
...
Рейтинг: 0 / 0
Помогите с запросом
    #34862321
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Автор

Идею тебе уже подсказали.
Попробуй довести её до ума самостоятельно.

А у меня есть ещё пара вопросов:
1) Всегда ли блокировки/разблокировки чередуются?
2) Что делать, если есть только одна запись о блокировке в указанном интервале дат?
...
Рейтинг: 0 / 0
Помогите с запросом
    #34862351
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) по умолчанию, то есть в момент времени < select min(add_date) where id=?, клиент считается заблокированным или разблокированным?

смежный вопрос: 1a) какая первая по времени запись для любого клиента - блокировка или разблокировка?

2) для клиента могут быть две соседние (по add_date) строки с одинаковым действием? (в этом случае последняя избыточная.)

смежный вопрос: 2a) следует ли из наличия записи с некоторым add_date для данного клиента, что в момент времени непосредственно предшествующий add_date клиент имел статус ^action (отрицание от action)?
...
Рейтинг: 0 / 0
Помогите с запросом
    #34862563
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за подсказку, дальше без проблем доделаю.
PS: Если записей нет, то считается,что клиентразблокирован, повторные действия могут быть только при ошибках (нужно будет триггер написать, чтобы оператор не смог дважды забл или разблокировать клиента). На самом деле таблица более сложная, указываются причины блокировки, виды блокировок итд.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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