Войти

Показать полную графическую версию : выборка из одной столбца таблицы с несколькими условиями + count


Armsinglom
17-12-2020, 11:35
Добрый день.
Есть 2 таблицы (1. stend_monitoring 2.stand_status) в PSQL, примерно такого содержания:
num_stend stamp_ name_event
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется
1205 2020-12-16 10:05:08 Контейнер установлен
2205 2020-11-15 12:04:08 Контейнер изъят
1205 2020-10-14 13:07:08 Книга используется
2205 2020-12-16 10:05:08 Контейнер установлен
1205 2020-11-15 12:04:08 Контейнер изъят
2205 2020-10-14 13:07:08 Книга используется

num_stend object_ name_status
1205 1 книга у читателя
2205 1 книга на складе

Необходим следующий select :
1) показать num_stend
2) по num_stend показать последнюю дату когда был "Контейнер изъят".
3) по num_stend показать последнюю дату когда был "Контейнер установлен".
4) по num_stend показать последнюю дату "Книга используется" после даты последнего события "Контейнер установлен".
5) по num_stend показать последнюю дату "Книга используется"
6) из второй таблицы (stand_status) нужен просто текущий name_status. (в таблице name_status постоянно обновляется, нужно просто забирать этот status)
7) Посчитать общее кол-во строк "Книга используется" после последнего события "Контейнер установлен"

Попытался сделать следующим образом:
SELECT t1.num_stend as номер_стенда, t3.stamp_ as Контейнер изъят, t1.stamp_ as Контейнер установлен, t2.stamp_ as Книга используется, t4.name_event as Состояние
FROM azt.stend_monitoring t1, azt.stend_monitoring t2, azt.stend_monitoring t3, azt.stand_status t4
where t1.num_stend = '2205'
and t1.name_event = 'Контейнер установлен'
and t2.num_stend = t1.num_stend
and t2.name_event = 'Книга используется'
and t2.stamp_ > t1.stamp_
and t3.num_stend = t1.num_stend
and t3.name_event = 'Контейнер изъят'
and t4.num_stend = t1.num_stend
and t4.object_ = 1
order by t1.id desc, t2.id desc, t3.id desc LIMIT 1
В принципе select отрабатывает, но за 9 секунд как то долговато но терпимо, а вот если я к ниму прикручиваю пункт. номер 7 (где нужно вывести общее кол-во строк), COUNT (*) и начинаю группировать GROUP BY .... то запрос уходит на 5-7 минут раздумий и я не дожидаясь результата отключаю его.
Можете помочь с оптимизацией запроса?

Armsinglom
18-12-2020, 17:09
Немного изменил скрипт, стал отрабатывать за 200 мс. Остались не решенными 2 проблемы:
1) как добавить сюда общее число строк "Книга используется" после последнего события "Контейнер установлен"
2) Можно ли как то уменьшить необходимость кол-во ввода значения num_stend.

select * from
(Select MAX(num_stend) AS номер_стенда, MAX(stamp_) AS Контейнер изъят from azt.stend_monitoring where name_event = 'Контейнер изъят' and num_stend = '1205') T2,
(Select MAX(stamp_) AS Контейнер установлен from azt.stend_monitoring where name_event = 'Контейнер установлен' and num_stend = '1205') T3,
(Select MAX(stamp_) AS Последняя_транзакция from azt.stend_monitoring where name_event = 'Книга используется' and num_stend = '1205') T4,
(Select name_event AS Состояние_стенда from azt.stand_status where object_ = 1 and num_stend = '1205') T5

Busla
19-12-2020, 11:19
правильнее было бы использовать явный LEFT JOIN

1) показать num_stend »
в такой формулировке это больше похоже на
select '1205' as num_stend
показать запрошенный num_stend
а то, что вы делаете - это выбрать запрошенный num_stend

впрочем, последующие показать демонстрируют, что составивший задание просто не "рубит в теме"




© OSzone.net 2001-2012