powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подсчет %значений
6 сообщений из 6, страница 1 из 1
Подсчет %значений
    #39925599
thehigh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Имеется таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE etp_msg_log
(
  id bigint NOT NULL,
  sent_time timestamp with time zone,
  received_time timestamp with time zone,
  doctype integer,
  CONSTRAINT etp_msg_log_pkey PRIMARY KEY (id)
)


И мой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
to_char(dt, 'dd.MM.yyyy') as "Date",
round(100.0*sum(case when len is null and t.doctype= 260 then 1 else 0 end)/SUM(CASE WHEN t.doctype=260 THEN 1 ELSE 0 END)) as "% for 260",
round(100.0*sum(case when len is null and t.doctype= 980 then 1 else 0 end)/SUM(CASE WHEN t.doctype=980 THEN 1 ELSE 0 END)) as "% for 980",
to_char(avg(len), 'HH24:MI:SS.MS') as "Avg answer time"
from (
     select date_trunc('day',sent_time) dt, received_time-sent_time len, doctype
     from etp_msg_log
 ) t
group by dt
order by dt;


Как мне к этому запросу добавить время, в которое укладываются 90% запросов по определенному doctype. Например 12.02.2020 было 10 запросов, на 9 из них ответы были менее чем за 10сек(received_time-sent_time), вот мне нужно это число так же по датам как и остальную статистику. По конкретной дате я это могу посчитать отдельным запросом, но как это встроить в мой?
...
Рейтинг: 0 / 0
Подсчет %значений
    #39926083
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thehigh,

приведите тестовые данные, желаемый результат на них и ваше "По конкретной дате я это могу посчитать отдельным запросом". Возможно это ускорит получение "как это встроить"
...
Рейтинг: 0 / 0
Подсчет %значений
    #39926167
thehigh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Щукина Анна,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
to_char((select (t.received_time - t.sent_time
                           ) as "p90 для времени ответа на запросы по 260"
                from (
                         select ee.sent_time,
                                ee.received_time,
                                count(*) over (partition by (ee.received_time - ee.sent_time))                                  as cnt,
                                row_number()
                                over (partition by (ee.received_time - ee.sent_time) order by (ee.received_time - ee.sent_time) desc ) as rn
                         from etp_msg_log ee
                         where ee.doctype = 260
                           and ee.received_time is not null
                     ) t
                where rn / cnt <= 0.9
                limit 1), 'HH24:MI:SS.MS')


Вот кусочек, который считает нужное мне время, но по всем записям. Какие тестовые данные вы имеете ввиду, таблицу я привел, описать что требуется получить описал. Можно вставить в таблицу любые данные, как они повлияют на запрос? Главное чтобы правильно высчитывалось.
...
Рейтинг: 0 / 0
Подсчет %значений
    #39926175
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
thehigh,

Код: plsql
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
-- Тестовые данные
WITH 
a("Дата и время", "received_time - sent_time, секунд") AS 
(
	SELECT '2020-01-10 01:01:20'::TIMESTAMP, 1.01::REAL UNION ALL SELECT '2020-01-10 01:01:20', 1.05 UNION ALL  
	SELECT '2020-01-10 01:01:20', 1.01	UNION ALL SELECT '2020-01-10 01:01:20', 1.07	UNION ALL  
	SELECT '2020-01-10 01:01:20', 1.0	UNION ALL SELECT '2020-01-10 01:01:20', 1.0	UNION ALL  
	SELECT '2020-01-10 01:01:20', 1.0	UNION ALL SELECT '2020-01-10 01:01:20', 1.0	UNION ALL  
	SELECT '2020-01-10 01:01:20', 1.0	UNION ALL SELECT '2020-01-10 01:01:20', .8	UNION ALL  
	SELECT '2020-01-10 01:01:20', 1.0	UNION ALL SELECT '2020-01-10 01:01:20', 1	UNION ALL 
	SELECT '2020-10-10 01:01:20', 1.21	UNION ALL SELECT '2020-10-10 01:01:20', 1.25	UNION ALL  
	SELECT '2020-10-10 01:01:20', 1.31	UNION ALL SELECT '2020-10-10 01:01:20', 1.37	UNION ALL  
	SELECT '2020-10-10 01:01:20', 1.4	UNION ALL SELECT '2020-10-10 01:01:20', 1.0	UNION ALL  
	SELECT '2020-10-10 01:01:20', 1.0	UNION ALL SELECT '2020-10-10 01:01:20', .8	UNION ALL  
	SELECT '2020-10-10 01:01:20', 1.0	UNION ALL SELECT '2020-10-10 01:01:20', 1		
), 
-- Решение
b AS 
(
	SELECT 
		z."Дата", 

		100 * 
		SUM(a."received_time - sent_time, секунд") 
			OVER (PARTITION BY z."Дата" ORDER BY a."received_time - sent_time, секунд" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 
		/
		SUM(a."received_time - sent_time, секунд") 
			OVER (PARTITION BY z."Дата") AS "Процент, %",  

		FORMAT('от %s сек. до %s сек.', 
				MIN(a."received_time - sent_time, секунд") 
					OVER (PARTITION BY z."Дата"),
				MAX(a."received_time - sent_time, секунд") 
					OVER (PARTITION BY z."Дата" ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
			  ) AS "Диапазон"
	FROM a, 
		LATERAL(SELECT a."Дата и время"::DATE) AS z("Дата"))
SELECT 
	b."Дата", 
	b."Диапазон", 
	MAX(b."Процент, %")::numeric(5,2) AS "Процент, %"  
FROM b	
	GROUP BY b."Дата", b."Диапазон"
	ORDER BY b."Дата", "Процент, %"  
/*	
	Дальше выбираете из полученного списка строку с нужным процентом и 
	джойните с вашим рекордсетом по (ON "Дата" = sent_time::DATE)
*/
...
Рейтинг: 0 / 0
Подсчет %значений
    #39926187
thehigh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint,

Вы не совсем поняли вопрос, и я тему так назвал, тоже немного ввел в заблуждение. Вот что требуется конкретно:
по каждой дате выдать: "% для 260" это %запросов без ответа для doctype=260(это есть) , "p90 для 260"(время ответа, в которое укладывается 90% запросов, тут имеется ввиду received_time-sent_time), "% для 980", "p90 для 980". Ниже мой запрос, в котором я получаю "% для 260" и "% для 980". Может быть запрос должен быть другим для получения всех 4 значений по дате.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
to_char(dt, 'dd.MM.yyyy') as "Date",
round(100.0*sum(case when len is null and t.doctype= 260 then 1 else 0 end)/SUM(CASE WHEN t.doctype=260 THEN 1 ELSE 0 END)) as "% for 260",
round(100.0*sum(case when len is null and t.doctype= 980 then 1 else 0 end)/SUM(CASE WHEN t.doctype=980 THEN 1 ELSE 0 END)) as "% for 980"
from (
     select date_trunc('day',sent_time) dt, received_time-sent_time len, doctype
     from etp_msg_log
 ) t
group by dt
order by dt;
...
Рейтинг: 0 / 0
Подсчет %значений
    #39926190
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
thehigh,
это пример расчета процента, примените его к своим данным и условиям и получите результат
(удочка, а рыбу сами), а если хотите получить готовое решение, то 22078937 (((((
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подсчет %значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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