Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
Есть таблица Cn(ServerName, ConnectionType, UserName, ConnectionDate, DisconnectionDate), в которую заносятся подключения с типом ConnectionType к серверу ServerName пользователя UserName в день ConnectionDate. Когда пользователь отключается дата отключения заносится в DisconnectionDate. Не могу сообразить, как вывести таблицу по "Серверу1", в строках которой будут даты за каждый день, например марта, а в столбцах количество активных подключений на этот день, количество по типам подключения, количество по пользователям.
То есть:
ДатаОбщееТип1Тип2Тип3Юзер1Юзер2
01.03.175322310530
02.03.17511812212526

И тд
Запрос за один день - дело понятное, а вот в таком виде - не знаю.
19 май 17, 11:25    [20495552]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1097
Ramramm, здесь можно найти как в сообщении на форуме оформить таблицу.
19 май 17, 11:33    [20495579]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 1097
DDL в студию!
19 май 17, 11:36    [20495595]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
Ramramm,

А что понятно за один день? Не вижу разницы - один день, не один.
19 май 17, 11:37    [20495598]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Граур Станислав
Member

Откуда:
Сообщений: 860
KreatorXXI
Ramramm,
А что понятно за один день? Не вижу разницы - один день, не один.


Ему произвольное кол-во столбцов нужно в запросе.
19 май 17, 11:54    [20495684]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
rdb_dev, спасибо, но отредактировать уже не могу. Буду знать.
Модератор: С этим помогу.
19 май 17, 12:14    [20495779]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
Граур Станислав,

А как Вы догадались? В посте ни слова про это.
На самом деле, если так, то скорее на клиенте такую таблицу легче сделать.
19 май 17, 12:26    [20495843]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI,я пока могу получить очень отдаленный от нужного результат. на самом деле не критично, если таблица будет транспонирована. То есть результат, в котором столбцы и строки поменяны местами тоже норм.

Я умею выводить за день как раз транспонированную и только по одному критерию:
SELECT ConnectionType, COUNT(*) 
FROM Cn
WHERE (ConnectionDate<='19.05.2017' AND DisconnectionDate>'19.05.2017') AND ServerName = 'Server1' 
GROUP BY ConnectionType 

Результат будет такой :
Type1 20
Type2 25
Type3 14
19 май 17, 12:31    [20495877]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI
Граур Станислав,

А как Вы догадались? В посте ни слова про это.
На самом деле, если так, то скорее на клиенте такую таблицу легче сделать.


Да, произвольное. Количество типов и пользователей варьируется.
19 май 17, 12:34    [20495892]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12439
Ramramm,

Тебе поможет производственный календарь. Надеюсь, у тебя есть такой в системе?
Если нет, то придётся его создать, например, виртуально, процедурой.

Пусть на выходе будет Calendar (cDate)
Тогда примерно так:

select c.cDate,
       "Общее" ConnectionType,
       count(*) ConnectionCount
  from Calendar c
       left join Cn Cn on (Cn.ConnectionDate <= c.cDate and Cn.DisconnectionDate > c.cDate)
  where c.cDate between :BeginDate and :EndDate
  group by c.cDate

union all

select c.cDate,
       Cn.ConnectionType,
       count(*) ConnectionCount
  from Calendar c
       left join Cn Cn on (Cn.ConnectionDate <= c.cDate and Cn.DisconnectionDate > c.cDate)
  where c.cDate between :BeginDate and :EndDate
  group by c.cDate, Cn.ConnectionType


Ниже можешь добавить в разрезе пользователей по аналогии.
19 май 17, 12:45    [20495983]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
WildSery, спасибо. Календаря нет, ща буду курить в его направлении.
19 май 17, 12:53    [20496039]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12439
Ramramm,

Вот здесь можно процедурку подсмотреть.

Ну, либо физически в виде таблицы его создать и заполнять.
Но это уже если действительно постоянно используется, для табелей, банковских дней и прочей календарной лабуды.
Вот попытка охватить всё.
19 май 17, 13:41    [20496358]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
Ramramm,

В вашем случае типа вот так:
SELECT ConnectionDate, ConnectionType,  COUNT(*) 
FROM Cn
WHERE (ConnectionDate<='19.05.2017' AND DisconnectionDate>'19.05.2017') AND ServerName = 'Server1' 
GROUP BY ConnectionDate, ConnectionType 

Транспонирование - отдельная проблема. Файербёрдом. боюсь, просто не решить. Если тип соединения ещё можно как-то обработать (думаю количество типов - известно и относительно мало), то с пользователями непонятно как быть.
В качестве раздумий - может имеет смысл даты по горизонтали пустить. Скажем, если рассматривается месяц, то отличие только в конце месяца, уже можно уцепиться.
19 май 17, 13:47    [20496379]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI, я имею ввиду, что повернутый результат меня тоже устроит. Я не буду его транспонировать и т.п. Поэтому, так как Вы предлагаете, даты по горизонтали пустить, меня тоже устраивает в виде конечного результата.
19 май 17, 13:56    [20496420]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI
Ramramm,

В вашем случае типа вот так:
SELECT ConnectionDate, ConnectionType,  COUNT(*) 
FROM Cn
WHERE (ConnectionDate<='19.05.2017' AND DisconnectionDate>'19.05.2017') AND ServerName = 'Server1' 
GROUP BY ConnectionDate, ConnectionType 

Понял, но это также на одну дату. Пока пробую с календарем. А если даты по горизонтали, то как мне получить множество столбцов? Проще ли этот вариант, чем с календарем? ибо пока я не представляю, как мне диапазон дат в SELECT засунуть.
19 май 17, 14:02    [20496455]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
WildSery, ага, спасибо, второй вариант уже гугл мне показал.
19 май 17, 14:03    [20496465]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI
Ramramm,

В вашем случае типа вот так:
SELECT ConnectionDate, ConnectionType,  COUNT(*) 
FROM Cn
WHERE (ConnectionDate<='19.05.2017' AND DisconnectionDate>'19.05.2017') AND ServerName = 'Server1' 
GROUP BY ConnectionDate, ConnectionType 

Нет, этот вариант и за одну дату выводит не то что нужно. Пользователи и типы должны быть в одном столбце(или строке) , а вот втором столбце(или строке) - количество. А тут SELECT из уже в 2 столбца выводит.
19 май 17, 14:49    [20496661]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
Ramramm,

Вы меня не поняли. Для начала нужно получить количество коннектов за день по каждому типу (Допустим, не рассматриваем для начала пользователей). Мой запрос это делает. А вторым шагом нужен второй запрос, который из этого запроса правильно просуммирует нужные данные. В FB это конструкция "select ... from select ..." или можно использовать CTE.
Использование в данном случае union all приведёт только к увеличению времени запроса. Грубо говоря вы будете несколько раз проходить всю таблицу только с разными фильтрами. Смысла нет.
19 май 17, 15:27    [20496807]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12439
KreatorXXI,

Может, и быстрее, но это ещё не факт.
Вот только SELECT ConnectionDate - неправильно. Она может быть позавчерашней.
19 май 17, 15:54    [20496905]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
WildSery,
Я же привёл образец. ТС что хочет видеть в таблице? ConnectionDate? Тогда в фильтре условие типа:
WHERE (ConnectionDate between '01.05.2017' AND '31.05.2017') AND ServerName = 'Server1' 

Я же говорю - нет полного описания задачи. Приходиться догадываться.
19 май 17, 16:03    [20496935]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
WildSery,

И, конечно, вопрос. В таблице "Дата". Что это? ConnectionDate или DisconnectionDate?
19 май 17, 16:11    [20496960]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Ramramm
Member

Откуда:
Сообщений: 14
KreatorXXI, просто календарные даты. Например, с 01.03.17 по 30.03.17. Даты, в которых не было изменений соединений, можно отпустить, но это не обязательно.
19 май 17, 16:13    [20496970]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43043

Забей на SQL. Получай на клиента голые данные, а там уже сам группируй в шахматке/массиве
или любых других имеющихся под рукой структурах.

Posted via ActualForum NNTP Server 1.5

19 май 17, 16:20    [20496995]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 159
Ramramm,

Т.е. ConnectionDate. A ConnectionType что это? В отдельной таблице лежит? Или какой-то ограниченный набор? Вы бы привели кусок данных Вашей таблицы.
19 май 17, 16:23    [20497006]     Ответить | Цитировать Сообщить модератору
 Re: Количество подключений за каждый день  [new]
WildSery
Member

Откуда: да, оттуда.
Сообщений: 12439
Dimitry Sibiryakov,

Судя по всему, он так и собирается, получив "транспонированные" данные сперва.
19 май 17, 16:29    [20497025]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить