Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   выборка из одной столбца таблицы с несколькими условиями + count (http://forum.oszone.net/showthread.php?t=347371)

Armsinglom 17-12-2020 11:35 2943275

выборка из одной столбца таблицы с несколькими условиями + count
 
Добрый день.
Есть 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 2943409

Немного изменил скрипт, стал отрабатывать за 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 2943458

правильнее было бы использовать явный LEFT JOIN

Цитата:

Цитата Armsinglom
1) показать num_stend »

в такой формулировке это больше похоже на
Код:

select '1205' as num_stend
показать запрошенный num_stend
а то, что вы делаете - это выбрать запрошенный num_stend

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


Время: 23:04.

Время: 23:04.
© OSzone.net 2001-