Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
1

Статистика из очереди сообщений

13.03.2016, 13:27. Просмотров 2143. Ответов 15
Метки нет (Все метки)

Ребят, выручайте. Я SQL вообще не знаю, а задание надо сделать, дедлайн скоро. Сижу, читаю, но никак не могу понять, как правильно сделать. Помогите, пожалуйста или тыкните, где почитать, где разжевано для чайников.

Сама база данных (представлена на картинке)
Кто что делает:
Справочник типов сообщений – таблица QRY_TYPE (ID – уникальный идентификатор типа, С_NAME – название типа, C_AB_REF – ссылка на абонента который обрабатывает данные типы сообщений).

Справочник типов абонентов – таблица ST_ABONENTS (ID – уникальный идентификатор абонента, С_NAME – название абонента)

Входящая очередь сообщений – таблица QRY_QUEUE (ID – уникальный идентификатор сообщения, С_IN_TIME – дата и время записи в таблицу, C_EXEC_TIME – дата и время обработки сообщения, C_ST – статус обработки сообщения (null - сообщение не обработано, 1 – сообщение успешно обработано, 0 – ошибка при обработке сообщения), C_QRY_TYPE – ссылка на тип запроса)

Собственно задания:
1. Статистика в разрезе абонентов (сколько сообщений успешно обработалось/сколько с ошибкой/сколько не обработано)
2. Абоненты у которых количество неуспешно обработанных сообщений менее 20
3. Абонент с наибольшем количеством сообщений
0
Миниатюры
Статистика из очереди сообщений  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2016, 13:27
Ответы с готовыми решениями:

Очереди сообщение (создание очереди из N сообщений)
Нужна помощь в создании очереди из n сообщений как создать простую очередь я знаю но как указать...

Нужна статистика за месяц количества входящих и отправленных сообщений
Всем добрый день! Нужна статистика за месяц количества входящих и отправленных сообщений на/с...

Очереди сообщений
Доброго всем дня!подскажите пожалуйста и помогите с написанием с неочень большой и сложной...

Клиенты и сервера. Очереди сообщений.
Задача на С: Существуют два клиента и 1 сервер Клиенты читают строки из файла, причём: клиент...

15
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 12:09 2
Прошу уточнить, статистика и все прочее нужно по всей базе, или за какие-то периоды (один период)

Добавлено через 13 минут
Остальные замечания как в теме
Цитата Сообщение от Ирина0505 Посмотреть сообщение
Прикладываю структуру
ST_ABONENTS - это не справочник типов абонентов, а просто справочник абонентов.
Правильно ли я понимаю, что (в соответствии со схемой) сообщение может поступить на обработку только одному абоненту (другого кандидата на обработку просто нет), но каждый абонент может обрабатывать несколько типов сообщений?
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 13:38  [ТС] 3
Да, все верно. Один абонент может обрабатывать несколько типов (тут скорее видов, потому что сообщения именуются: сообщения е вид 1, сообщение вид 2 и т.д.)
Статистика по этим заданиям нужна за все время.
Если есть необходимость могу в личку скинуть скрипт, который создаёт данную базу.

Щас прочитаю тему Ирины, отвечу по замечаниям, которые вы дали ей.

Добавлено через 1 час 3 минуты
Цитата Сообщение от AGK Посмотреть сообщение
Остальные замечания как в теме
Я думаю, что это задание пробное, поэтому его надо максимально упрощать.
Сам я с sql не дружу, но из того, что понял покопавшись в задании, могу сказать:

1.
Цитата Сообщение от AGK Посмотреть сообщение
1) Можно ли считать, что длительность обработки любого сообщения любым абонентом, грубо говоря, нулевая? Как быть, если у двух сообщений одного абонента одинаковое значение C_EXEC_TIME?
Да. Мне даже кажется, что так и есть. Сообщение обрабатывается мгновенно.
По поводу C_EXEC_TIME....я честно говоря, не понял суть вопроса, но я думаю, что можно это просто не обрабатывать. Сомневаюсь, что в тестовом задании будет одинаковое время.

2.
Цитата Сообщение от AGK Посмотреть сообщение
Пусть сообщение записано, но не обработано (C_ST is null). Что при этом стоит в C_EXEC_TIME?
По идее, если делать выборку по этим двум столбцам при условии, что C_ST= null, то и C_EXEC_TIME пустая строчка должна быть.

3.
Цитата Сообщение от AGK Посмотреть сообщение
Что означает ситуация, когда стоит вполне себе человеческое C_EXEC_TIME, но при этом C_ST is null?
Опять же. Задание для новичков, поэтому я предполагаю у данной базы нет такого состояния, а даже если есть, то оно для получения выборки не мешает, на мой взгляд. Выборка будет по одному из столбцов, поэтому кол-во сообщений с статусом null считать по всем строчкам и также по всем строчкам время обработки в столбце C_EXEC_TIME. Подозреваю, что выходные данные будут неточными, но задание, повторюсь, тестовое. Четкость сильно не нужна.

4.
Цитата Сообщение от AGK Посмотреть сообщение
Что вообще означает "час пиковой нагрузки по всем абонентам"?
В ответах к заданию дана табличка демонстрирующая два столбца:
час и кол-во сообщений. Подозреваю, что все таки есть такой час в котором участвуют все абоненты и задание стоит немного переформулировать. Пиковый час по всем абонентам это значит, что ВСЕ абоненты обработали сообщений за этот час больше, чем за все остальные часы.

5.
Цитата Сообщение от AGK Посмотреть сообщение
нагрузка распределена до безобразия равномерно?
Берем любой час.

6.
Цитата Сообщение от AGK Посмотреть сообщение
Как быть, если максимальная нагрузка возникает не в "круглом" интервале (скажем, с 11:00 до 12:00), а с 11:27 до 12:25 ? Это час или не час?
Вот этим просто в тупик Наверно это не час. Потому что, как я понимаю, по заданию надо разбить четко на часы все сообщения ( например, с 13:00 до 14:00, с 23:00 до 00:00) и считать уже в этих диапазонах кол-во сообщений, чтоб узнать сколько обрабатывается за 10 сек.

Только щас сообразил, что пытаюсь дополнить вопросы из другой темы но с теми заданиями у меня тоже проблема

Есть скрипт, который создает всю эту базу, если это как-то поможет, то могу и его скинуть в личку.

AGK, спасибо, что уделяешь время, надеюсь ты сможешь помочь.
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 14:59 4
Цитата Сообщение от TitanKomi Посмотреть сообщение
Абонент с наибольшем количеством сообщений
А смысл? Пусть А -абонент с наибольшим количеством сообщений, но успешно обработано только одно, а все остальные не обработаны. Ну и для чего он такой нужен? Может быть, интересует абонент с наибольшим количеством успешно обработанных сообщений? Можно и так, и так, но смысла не вижу.
Цитата Сообщение от TitanKomi Посмотреть сообщение
Пиковый час по всем абонентам это значит...
Это очень жесткое условие. Именно такого часа может не существовать в принципе с очень большой вероятностью.
Я писал в качестве альтернативы, что, может быть, нужно найти час максимальной загрузки для каждого абонента. Для каждого свой. Лично я вытряс бы уточнения из заказчика в момент выдачи задания.
Цитата Сообщение от TitanKomi Посмотреть сообщение
Вот этим просто в тупик
На самом деле это тоже вопрос по чистоте постановки. И от этого зависит, какое окно надо формировать - скользящее или фиксированное. И, соответственно, разные запросы будут.
Вообще, я вопросы не просто так задаю, так сказать, из желания поиздеваться. Я задаю вопрос, если вижу дыру в постановке. И надо, хотя бы, говорить, что уточнение невозможно по независимым причинам. Тогда либо приходится домысливать, либо рассматривать несколько вариантов

Добавлено через 9 минут
Во всех последующих селектах будет одно и то же "ядро" - некий селект (вьюха), из которого надо сформировать задания 1,2,3.
SQL
1
2
3
4
5
6
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
     qry_type  t,
     st_abonents a
WHERE a.c_qry_type = t.id
  AND t.c_ab_ref  = a.id ;
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 15:04  [ТС] 5
Цитата Сообщение от AGK Посмотреть сообщение
Можно и так, и так, но смысла не вижу.
Я думаю, что его просто нет. Просто дано задание, которое выслано по электронной почте с табличками-ответами, которые должны получиться.

Цитата Сообщение от AGK Посмотреть сообщение
Именно такого часа может не существовать в принципе с очень большой вероятностью.
Почему? Я тут вас, наверно не понял. Может в задании имеется ввиду, что надо пройтись по каждому часу и сложить все сообщения всех абонентов? И в итоге выйдет, что все абоненты (даже если какой-то не работал в этот час) за этот час приняли столько-то сообщений, за другой столько-то и в итоге на каком часу сообщений будет больше, тот и пиковый.

Да я все понимаю. Раз уж сам не знаю, то как могу стараюсь помочь делу знающих людей. К сожалению, у меня только постановка задачи и ответы...
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 15:10 6
Лучший ответ Сообщение было отмечено TitanKomi как решение

Решение

Это статистика в разрезе абонентов с сортировкой по абонентам в алфавитном порядке
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT c_name, 
       COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END) cnt_suqsess,      --  успешно
       COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END) cnt_error,        --  с ошибкой
       COUNT(DISTINCT CASE WHEN c_st IS NULL THEN id ELSE NULL END) cnt_fail    --  не обработано
FROM (
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
     qry_type  t,
     st_abonents a
WHERE a.c_qry_type = t.id
  AND t.c_ab_ref  = a.id ; 
) GROUP BY c_name
ORDER BY c_name;
Добавлено через 4 минуты
Это абоненты у которых количество неуспешно обработанных сообщений менее 20. В принципе, в селекте можно оставить только c_name, а все остальное выкинуть. Я просто хотел показать, как одно задание плавно перетекает в другое.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT c_name 
       --, COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END) cnt_suqsess,      --  успешно
       -- COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END) cnt_error,        --  с ошибкой
       -- COUNT(DISTINCT CASE WHEN c_st IS NULL THEN id ELSE NULL END) cnt_fail    --  не обработано
FROM (
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
     qry_type  t,
     st_abonents a
WHERE a.c_qry_type = t.id
  AND t.c_ab_ref  = a.id ; 
) GROUP BY c_name
HAVING COUNT(DISTINCT CASE WHEN c_st=0 THEN id ELSE NULL END)  <20
ORDER BY c_name;
1
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 15:18  [ТС] 7
Цитата Сообщение от AGK Посмотреть сообщение
qry_queue q,
* * *qry_type *t
Интересно. Выходит тут, как в ООП можно объявлять что-то типа объектов классов? Только в данном случае, наверно, переменная таблицы...
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 15:32 8
А это - абонент с наибольшем количеством сообщений. Если наибольшее количество всех надо заменить на наибольшее количество успешных, то вместо count(*) в двух местах пишем COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END)
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT c_name
FROM (
SELECT c_name, COUNT(*) cnt, MAX(COUNT(*)) OVER () cnt_max
FROM (
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
     qry_type  t,
     st_abonents a
WHERE a.c_qry_type = t.id
  AND t.c_ab_ref  = a.id ; 
) GROUP BY c_name
) WHERE cnt=cnt_max
ORDER BY c_name;
Добавлено через 3 минуты
Цитата Сообщение от TitanKomi Посмотреть сообщение
можно объявлять что-то типа объектов классов
Не понял, почему Вы пришли к такому выводу. В Oracle это называется алиас (или псевдоним) таблицы. Если таблица имеет длинное имя, то можно присвоить ей короткий алиас и упростить написание запроса. Алиас действует только в том селекте, в WHERE которого он объявлен. Ни выше, ни ниже не действует, даже если это один и тот же оператор
1
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 15:33  [ТС] 9
Цитата Сообщение от AGK Посмотреть сообщение
в двух местах пишем
Немного не понял, вот так чтоли?

SELECT c_name
FROM (
SELECT c_name, COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END) cnt, MAX(COUNT(DISTINCT CASE WHEN c_st=1 THEN id ELSE NULL END)) OVER () cnt_max
FROM (
SELECT q.id, q.c_exec_tyme, q.c_st, a.c_name
FROM qry_queue q,
qry_type t,
st_abonents a
WHERE a.c_qry_type = t.id
AND t.c_ab_ref = a.id ;
) GROUP BY c_name
) WHERE cnt=cnt_max
ORDER BY c_name;
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 15:35 10
Цитата Сообщение от TitanKomi Посмотреть сообщение
вот так
Да, именно так
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 15:38  [ТС] 11
Цитата Сообщение от AGK Посмотреть сообщение
Не понял, почему Вы пришли к такому выводу. В Oracle это называется алиас (или псевдоним) таблицы. Если таблица имеет длинное имя, то можно присвоить ей короткий алиас и упростить написание запроса. Алиас действует только в том селекте, в WHERE которого он объявлен. Ни выше, ни ниже не действует, даже если это один и тот же оператор
Теперь понял. Сказанул не зная синтаксиса. Показалось похожим на строчку создания объекта класса.

Добавлено через 2 минуты
Знаю, немного нагло, но потихоньку, под шумок)
А не объясните ли, еще пару задачек?
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 17:52 12
Цитата Сообщение от AGK Посмотреть сообщение
AND t.c_ab_ref = a.id ;
В этой строке ";" быть не должно. Проскочила при копи-пасте, но во всех (наверное) селектах ее надо выкинуть

Добавлено через 22 минуты
Еще одну ошибку заметил. В этой строчке алиас должен быть "q", а я "a" написал
WHERE q.c_qry_type = t.id
И соответственно, эта ошибка перебежала во все последующие селекты
1
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 19:01  [ТС] 13
Цитата Сообщение от AGK Посмотреть сообщение
перебежала во все последующие селекты
Спасибо большое. Заметил данную ошибку только в двух селектах
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 19:18 14
Цитата Сообщение от AGK Посмотреть сообщение
в том селекте, в WHERE которого он объявлен
Тоже неверно. Алиас таблицы изначально объявляется во FROM, а в других местах только используется.
1
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 40
14.03.2016, 20:21  [ТС] 15
Цитата Сообщение от AGK Посмотреть сообщение
Тоже неверно
где то еще надо исправить? или это к сведению, что надо алиасы в фроме объявлять?
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
14.03.2016, 20:35 16
Цитата Сообщение от TitanKomi Посмотреть сообщение
где то еще надо исправить?
Нет-нет, это надо к сведению принять. Когда спешишь, много дурацких ошибок выскакивает. Если найду, что что-то надо исправлять, то я обязательно скажу где и как.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2016, 20:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Очереди сообщений в Linux ubuntu
Здравствуйте, есть две програмулины. Программа client читает данные (числа) из файла и посылает их...

Разработка Собственной Очереди Сообщений
Всем привет. Вот возник очередной философский вопрос. Есть офис с небольшим почтовым трафиком...

Как получить количество сообщений в очереди???
Мне нужно получить количество сообщений в очереди и если это количество больше 100, то отправить...

Rabbitmq удаление прочитанных сообщений из очереди
Имеется приложение на python, которое принимает сообщения и отправляет их в очередь rabbitmq....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.