powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос на получение данных
22 сообщений из 22, страница 1 из 1
Запрос на получение данных
    #38904215
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть устройство которое либо ничего не делает и шлет каждые 2 минуты значение 0 а есть период времени когда оно работает в течении часов 5-6 и выдает значения от 1 до 9

Данные хранятся в двух полях
dt datetime,
value int

Мне нужно получить данные из ближайшего от текущего времени периода активности устройства
Как составить запрос не могу сформулировать. Помогите пожалуйста
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904221
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
" ближайшего от текущего времени периода активности устройства " - неясная формулировка.
Индекс на datetime
Код: plsql
1.
select value  from actionlog order by datetime desc limit 1


Будет быстро
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904243
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin" ближайшего от текущего времени периода активности устройства " - неясная формулировка.
Индекс на datetime
Код: plsql
1.
select value  from actionlog order by datetime desc limit 1


Будет быстро

это будет не период а одно значение а мне нужен весь период ненулевых значений
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904265
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp,
Вы же не дали определения термина "период"
Он имеет постоянный интервал?
"каждые 2 минуты значение 0" - это и есть период?
А если "значения от 1 до 9", то они тоже поступают каждые 2 минуты?

where datetime between now() - '1 hour'::interval and now()
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904297
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sptadmin" ближайшего от текущего времени периода активности устройства " - неясная формулировка.
Индекс на datetime
Код: plsql
1.
select value  from actionlog order by datetime desc limit 1


Будет быстро

это будет не период а одно значение а мне нужен весь период ненулевых значений
Код: sql
1.
select dt  from actionlog WHERE value<>0 order by dt desc limit 1; -- endpoint 



тогда

Код: sql
1.
2.
3.
SELECT 
(select dt from actionlog WHERE value<>0 order by dt desc limit 1) AS  endpoint 
,(select dt  from actionlog WHERE value=0 AND dt< ((select dt  from actionlog WHERE value<>0 order by dt desc limit 1) ) order by dt desc limit 1 )  AS startpoint



и т.д.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904306
start of group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?Ы,

можно обойтись одним обращением к таблице.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904308
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
start of group,

можно и трусы через голову одевать, но по индексу пару раз сикнуть -- дешевле
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904353
30см.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?Ыно по индексу пару раз сикнуть -- дешевлеИз трех приведенных обращений к таблице двух скинутых трусов не получится - за индекс зацепятся. Для условия <> по одному полю и сортировки по другому полю эффективность индекса сомнительна.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904373
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
30см.?Ыно по индексу пару раз сикнуть -- дешевлеИз трех приведенных обращений к таблице двух скинутых трусов не получится - за индекс зацепятся. Для условия <> по одному полю и сортировки по другому полю эффективность индекса сомнительна.

забавный текст тест кейса, внушаит.

кста, на фсякей, одно "из обращений ктоблице индексу" -- задвоено. в 50 % случаев планер пж их идентифицирует как одно. ну вот есть в ём такая особость. в выпадающих -- можно и помочь, with [recursive]

а трусы на голове -- у вас
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904413
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CASE:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
-- create
CREATE TABLE actionlog
(
  a_id serial primary key ,
  dt timestamp NOT NULL UNIQUE,
  "value" int NOT NULL
)
WITH (
  OIDS=FALSE
);

--CREATE INDEX ON actionlog  (("value"=0),dt);
CREATE INDEX ON actionlog  (dt) WHERE ("value"=0);
CREATE INDEX ON actionlog  (dt) WHERE NOT ("value"=0);
-----------------------
--- data:
INSERT INTO actionlog (dt,"value")
SELECT 
	'2015-01-01'::timestamp + g*'2 minutes'::interval 
	,(random() * (g %10))::int4
FROM generate_series(1,100000) g;



как есть
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
--как есть
SELECT 
(select dt from actionlog WHERE value<>0 order by dt desc limit 1) AS  endpoint 
,(select dt  from actionlog WHERE value=0 AND dt< ((select dt  from actionlog WHERE value<>0 order by dt desc limit 1) ) order by dt desc limit 1 )  AS startpoint
----------------------
"Result  (cost=0.98..0.99 rows=1 width=0) (actual time=0.084..0.086 rows=1 loops=1)"
"  Buffers: shared hit=9"
"  InitPlan 1 (returns $0)"
"    ->  Limit  (cost=0.29..0.33 rows=1 width=8) (actual time=0.023..0.025 rows=1 loops=1)"
"          Buffers: shared hit=3"
"          ->  Index Scan Backward using actionlog_dt_idx1 on actionlog  (cost=0.29..2664.07 rows=76273 width=8) (actual time=0.015..0.015 rows=1 loops=1)"
"                Buffers: shared hit=3"
"  InitPlan 3 (returns $2)"
"    ->  Limit  (cost=0.61..0.65 rows=1 width=8) (actual time=0.040..0.042 rows=1 loops=1)"
"          Buffers: shared hit=6"
"          InitPlan 2 (returns $1)"
"            ->  Limit  (cost=0.29..0.33 rows=1 width=8) (actual time=0.012..0.014 rows=1 loops=1)"
"                  Buffers: shared hit=3"
"                  ->  Index Scan Backward using actionlog_dt_idx1 on actionlog actionlog_1  (cost=0.29..2664.07 rows=76273 width=8) (actual time=0.005..0.005 rows=1 loops=1)"
"                        Buffers: shared hit=3"
"          ->  Index Scan Backward using actionlog_dt_idx on actionlog actionlog_2  (cost=0.29..304.47 rows=7909 width=8) (actual time=0.034..0.034 rows=1 loops=1)"
"                Index Cond: (dt < $1)"
"                Buffers: shared hit=6"
"Planning time: 0.256 ms"
"Execution time: 0.129 ms"


...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904500
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
30см.,

сантиметровый, кейсы где ?
скрипт генерации йа выше нопейсал, есличо
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904501
?Ы,

Мой вариант (начало и конец группы - ненулевое значение)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
   max(dt) filter(where value > 0 and leadvalue = 0) start_of_group,
   max(dt) filter(where value > 0 and lagvalue  = 0) end_of_group
from (
   select dt, value, 
      lead(value, 1, 0) over(order by dt desc) leadvalue,
      lag (value, 1, 0) over(order by dt desc) leagvalue
   from actionlog
) tt

Должен зацепиться за index scan по уникальности dt, но это полное сканирование.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904508
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
partial index я не учел,
там функциональный есть (закомментирован), он не хуже (для кейса). хотя изврат, "в общем случае"

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

окна же тут всегда дадут полный скан.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904516
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
обычный индекс
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
'Result  (cost=1.12..1.13 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1)'
'  Buffers: shared hit=9'
'  InitPlan 1 (returns $0)'
'    ->  Limit  (cost=0.29..0.34 rows=1 width=8) (actual time=0.017..0.017 rows=1 loops=1)'
'          Buffers: shared hit=3'
'          ->  Index Scan Backward using actionlog_dt_key on actionlog  (cost=0.29..3494.29 rows=75450 width=8) (actual time=0.015..0.015 rows=1 loops=1)'
'                Filter: (value <> 0)'
'                Rows Removed by Filter: 1'
'                Buffers: shared hit=3'
'  InitPlan 3 (returns $2)'
'    ->  Limit  (cost=0.63..0.78 rows=1 width=8) (actual time=0.013..0.013 rows=1 loops=1)'
'          Buffers: shared hit=6'
'          InitPlan 2 (returns $1)'
'            ->  Limit  (cost=0.29..0.34 rows=1 width=8) (actual time=0.003..0.004 rows=1 loops=1)'
'                  Buffers: shared hit=3'
'                  ->  Index Scan Backward using actionlog_dt_key on actionlog actionlog_1  (cost=0.29..3494.29 rows=75450 width=8) (actual time=0.003..0.003 rows=1 loops=1)'
'                        Filter: (value <> 0)'
'                        Rows Removed by Filter: 1'
'                        Buffers: shared hit=3'
'          ->  Index Scan Backward using actionlog_dt_key on actionlog actionlog_2  (cost=0.29..1250.95 rows=8183 width=8) (actual time=0.013..0.013 rows=1 loops=1)'
'                Index Cond: (dt < $1)'
'                Filter: (value = 0)'
'                Rows Removed by Filter: 5'
'                Buffers: shared hit=6'
'Total runtime: 0.066 ms'





ваш прогнать не могу -- 9.3.6. ставить 9.4 для теста -- лениво, но ожидаю фуллскана полюбасу.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904575
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Ы,

спасибо за помощь, но я хотел бы уточнить мне нужно получить все данные а не начало и окончание интервала
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904581
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sp?Ы,

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

есть начало и конец -- какие проблемы выдернуть промежуток ?

или вы за оптимальным алгоритмом ? -- ну так напишите хоть что-то, начнём сравнивать.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904608
spно я хотел бы уточнить мне нужно получить все данные а не начало и окончание интервалачего проще, открой курсор и фетчи строки. С интервалом 2 минуты за сутки бездействия наберется всего 720 лишних строк.
если же гарантирована запись показаний о работе каждые 2 минуты, то нули можно удалить/не читать.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904634
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дан приказ ему на запад,

вы не поняли суть вопроса - мне нужны данные в первом от текущего времени интервале а не все ненулевые данные за сутки
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904720
резултсет
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spвы не поняли суть вопросаесли не понял суть ответа, не держи других за тот же уровень умственного развития, что у тебя.
где я предлагал фетчить все записи?
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38904865
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
резултсет,

вы хотите поговорить об этом??)
мне это напомнило один монолог про "Пива нет".....))
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38905563
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp,

Опишите что вы хотите получить русским языком. Пока настолько расплывчато, что тут народ говорит о своем, а не о вашем.
...
Рейтинг: 0 / 0
Запрос на получение данных
    #38907936
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstone,

отчасти решение привели уже выше, но поясню - устройство периодами по несколько часов работает и выдает значение отличное от нуля, затем когда оно не работает, так скажем, оно выдает значение - 0. В базе все это складывается каждые 2 минуты. Необходимо выбрать все данные ближайшего от текущего момента времени отрезка когда устройство выдавало ненулевые данные
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос на получение данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]