Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - [решено] SQLite: поместить результаты запроса в нужные поля таблицы

Ответить
Настройки темы
Прочие БД - [решено] SQLite: поместить результаты запроса в нужные поля таблицы

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: Griboed0ff
Дата: 28-09-2021
Описание: Не указал, что ПК в таблице не один, а тысячи.
Доброго времени суток! Недавно познакомился с базой sqlite, мне так понравилось, что я решил хранить и накапливать некоторые данные именно в базе. Получать эти данные я хотел бы сразу в нужном виде, но я пока не могу составлять сложные запросы.
Дано: в таблицу собираются данные о факте логона пользователя на пк. Информация: имя пк, логин пользователя, дата время, тип логона.
Компьютеров в таблице тысячи, пример только для одного из них (см.причину исправления сообщения).
пример данных в таблице
Код: Выделить весь код
WorkstationName	TargetUserName	TimeCreated	logontype
name1	user1	21.09.2021 10:15	2
name1	user1	22.09.2021 14:19	2
name1	user1	21.09.2021 12:01	2
name1	user2	21.09.2021 15:06	2
name1	user2	22.09.2021 10:21	2
name1	user2	22.09.2021 15:01	2
name1	user2	22.09.2021 15:18	2
name1	user2	21.09.2021 15:59	2
name1	user2	22.09.2021 12:05	2
name1	user2	21.09.2021 10:32	2
name1	user2	21.09.2021 15:32	2
name1	user2	22.09.2021 10:24	2
name1	user2	21.09.2021 17:12	2
name1	user2	22.09.2021 15:51	2
name1	user3	21.09.2021 10:31	2
name1	user3	22.09.2021 10:33	2
name1	user3	22.09.2021 15:36	2
name1	user3	21.09.2021 14:11	2
name1	user3	22.09.2021 14:08	2
name1	user3	21.09.2021 10:32	2
name1	user3	22.09.2021 10:33	2
name1	user3	21.09.2021 12:07	2
name1	user3	22.09.2021 12:41	2
name1	user4	21.09.2021 14:44	2
name1	user4	22.09.2021 13:15	2

Задача: посчитать сколько раз вообще логинились на одном пк из спика, посчитать количество логонов на данном пк для каждого юзера, создать таблицу где поместим все эти данные в одну строку. Если пользователей одного пк больше чем 3, то оставить только 3 наибольших по кол-ву входов. Если пользователи имеют одинаковое кол-во входов, то выбрать по ближайшей дате логона. Учет вести только логоны не старше 100 дней, используя столбец даты времени. Все это для каждого ПК в таблице.
пример желаемого результата из примера выше
Код: Выделить весь код
WorkstationName	all logon	user 1	user 1 logon	user 2	user 2 logon	user 3	user 3 logon
name1	26	user2	11	user3	9	user1	3


создать табицу из запроса могу:
Код: Выделить весь код
CREATE TABLE IF NOT EXISTS users_result AS
посчитать сколько логонов всего для одного ПК могу:
Код: Выделить весь код
select WorkstationName, Count(*) from pc_users group by WorkstationName, WorkstationName;
ответ на запрос:
Код: Выделить весь код
U240-3;2
U240-4;1
U240-5;1
U240-6;2
U240-7;2
посчитать сколько логонов для каждого из пользователей могу:
Код: Выделить весь код
select WorkstationName, TargetUserName, Count(*) from test group by WorkstationName, TargetUserName, TargetUserName;
ответ на запрос:
Код: Выделить весь код
U431-2;U431;3
U431-3;U431;2
U431-2;U431;2
U431-4;U431;3
Отфильтровать записи младше 100 дней, скорее всего можно будет через Where.

А вот дальше начинаются вопросы. Как создать таблицу в нужном виде, учитывая условия? Возможно прибегнуть к временным таблицам? Буду рад любой помощи!

Отправлено: 15:13, 24-09-2021

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
создать таблицу где поместим все эти данные в одну строку. »
Не надо помещать. Количество входов получаете из таблицы обычным запросом с группировкой.

Цитата Griboed0ff:
только 3 наибольших по кол-ву входов. »
Код: Выделить весь код
SELECT TOP 3 … ORDER BY …
Update: предикат TOP отсутствует в данном диалекте — см. замечание коллеги El Sanchez ниже.

Последний раз редактировалось Iska, 26-09-2021 в 14:31. Причина: Замечание коллеги El Sanchez ниже


Отправлено: 01:57, 25-09-2021 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата Iska:
Не надо помещать. »
но мне нужно именно такое представление таблицы. Если не получится через базу, то нужно будет снова делать это руками через excel

Отправлено: 11:40, 25-09-2021 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Griboed0ff, я имею в виду, что данное актуальное (!) представление можно в любой момент получить запросом.

Отправлено: 12:04, 25-09-2021 | #4


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать


Цитата Iska:
SELECT TOP 3 … ORDER BY … »
Iska, такого в sqlite нет.

Griboed0ff,
Скрытый текст

Код: Выделить весь код
SELECT WorkstationName,
    sum(user_logon_count) OVER () AS all_logon,
    nth_value(TargetUserName, 1) OVER () AS "user 1",
    nth_value(user_logon_count, 1) OVER () AS "user 1 logon",
    nth_value(TargetUserName, 2) OVER () AS "user 2",
    nth_value(user_logon_count, 2) OVER () AS "user 2 logon",
    nth_value(TargetUserName, 3) OVER () AS "user 3",
    nth_value(user_logon_count, 3) OVER () AS "user 3 logon"
FROM (
    SELECT *
    FROM (
        SELECT *,
            printf('%s-%s-%s %s:00',
                substr(TimeCreated, 7, 4),
                substr(TimeCreated, 4, 2),
                substr(TimeCreated, 1, 2),
                substr(TimeCreated, 12)
            ) AS time_created,
            count(1) OVER (PARTITION BY TargetUserName) AS user_logon_count
        FROM pc_users
        WHERE WorkstationName = 'name1' AND
            time_created > datetime('now', '-100 days')
        ORDER BY user_logon_count DESC, time_created DESC
    ) GROUP BY TargetUserName
    ORDER BY user_logon_count DESC LIMIT 3
) LIMIT 1
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:33, 26-09-2021 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


El Sanchez, я вообще охренел, когда увидел * и просто имена полей в выборке с группировкой . Кстати, какая строка из нескольких, попавших в группировку, в этом случае берётся для таких полей?

Отправлено: 14:31, 26-09-2021 | #6


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать



Цитата Iska:
я вообще охренел, когда увидел * и просто имена полей в выборке с группировкой »
― Что это у тебя?
― Надо!
(из к/ф "Джентельмены удачи")
Цитата Iska:
Кстати, какая строка из нескольких, попавших в группировку, в этом случае берётся для таких полей? »
Iska, здесь 2 уровня вложенности SELECT. Во 2-ом выбираются строки не старше 100 дней и сортируются по убыванию сначала по количеству логонов, а потом по штампу времени логона. Если здесь делать группировку по пользователю, то от сортировки будет мало толку, в результат попадёт первая строка из группы неотсортированных строк, поэтому отсортированные строки поступают в SELECT 1-го уровня. Так как строки уже отсортированы при группировке первыми строками в группах будут строки с ближайшим штампом времени, результат сортируется по убыванию по количеству логонов, а затем ограничивается до 3 строк. Внешний SELECT формирует окончательный результат.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:26, 26-09-2021 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


El Sanchez, нет, я об общем принципе, который видел в соседней теме. Например:
Код: Выделить весь код
Field1	Field2	Field3
АААА	ЯЯЯЯ	Группа1
ББББ	ЮЮЮЮ	Группа2
ВВВВ	ЭЭЭЭ	Группа1
ГГГГ	ФФФФ	Группа2
ДДДД	ХХХХ	Группа2
Запрос:
Код: Выделить весь код
SELECT *
FROM MyTable
GROUP BY Field3
Какие значения попадут в поля Field1 и Field2 обеих строк результирующей выборки подобного запроса в SQLite?

Отправлено: 16:05, 26-09-2021 | #8


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1264
Благодарности: 1024

Профиль | Отправить PM | Цитировать



Цитата Iska:
Какие значения попадут в поля Field1 и Field2 обеих строк результирующей выборки подобного запроса в SQLite? »
Iska, АААА/ЯЯЯЯ для Группа1 и ББББ/ЮЮЮЮ для Группа2, т.к. это первые найденные строки при формировании групп.

Цитата Iska:
я об общем принципе, который видел в соседней теме. »
Iska, до меня дошло, к чему вы клоните. С HAVING, как из моего примера, не работает в вашем.

Последний раз редактировалось El Sanchez, 27-09-2021 в 16:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:51, 27-09-2021 | #9


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
Griboed0ff »
Попробовал ваш запрос, ошибки никакой не было, но и данных никаких нет. Позже я додумался сделать данные так же как и в своем примере, т.е. поместить данные только для одного имени ПК (name1), тогда заветный ответ на запрос появился. Получается, что ваш запрос работает только для одного имени ПК, а у меня их тысячи. Это все из-за неверное поставленного условия задачи мною.

Последний раз редактировалось Griboed0ff, 28-09-2021 в 12:48.


Отправлено: 20:29, 27-09-2021 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прочие БД - [решено] SQLite: поместить результаты запроса в нужные поля таблицы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MSFT SQL Server - [решено] Некоторые поля одной таблицы синкать с полями другой таблицы uptk Программирование и базы данных 5 01-09-2014 20:29
MySQL - Тип данных для поля ключевого поля Ali002 Программирование и базы данных 8 22-04-2014 22:09
Удаление записей таблицы по данным другой таблицы xNiSSaNx Вебмастеру 4 02-08-2013 21:58
Установка - [решено] Обновления от Microsoft: нужные, не нужные. Польза или вред. flev45 Microsoft Windows 7 18 29-09-2010 13:05
MSFT SQL Server - результаты запроса в виде текстового файла и его обработка minusodin Программирование и базы данных 7 30-03-2010 15:48




 
Переход