powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то вроде циклических запросов или ....
25 сообщений из 33, страница 1 из 2
Что-то вроде циклических запросов или ....
    #38895844
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, друзья!
Очень прошу помогите мне написать запрос, вообщем вывести все данные из таблицы следующим образом:
есть столбцы datebegin, dateend, operator, Type
Type - (type1, type2) тип для определения количества за определенный промежуток, в моем случае нужно подсчитать за определенный период, например от 8 часов утра до 12 часов дня подсчитать количество type1 и type2 с интервалом 30 минут, то есть их количество соответственно
8:00 8.30 9:00 9.30 10:00 10.30 11:00 11.30 12:00
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895866
репрезентативный юзабильный набор тестовых данных и желаемый результат на них резко повышает шансы на быстрый и правильный ответ. особенно, когда словесное описание хотелки хромает на обе ноги.
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895886
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895895
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
select un.* from (
   select 8.00 as hour,
   (select count(*) from table   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and   
   ("time"(dateend) >= cast(to_char(12.00*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((12+0.30)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'OUTGOING' ) as outcount,

   (select count(*) from table   
   where   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and 
   ("time"(dateend) >= cast(to_char(12*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((12+0.30)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'INCOMING' ) as inccount
   
   union all

select 8.30 as hour,
   
   (select count(*) from table   
   where 
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and   
   ("time"(dateend) >= cast(to_char((12 + 0.30)*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((12+1)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'OUTGOING') as outcount,

   (select count(*) from table   
   where   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and 
   ("time"(dateend) >= cast(to_char((12 + 0.30)*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((12+1)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'INCOMING') as inccount

  
   ) un
   order by un.hour
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895901
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но этот запрос у меня работает только с константами 8, 8.30 и т.д.
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895904
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
select un.* from (
   select 8.00 as hour,
   (select count(*) from table   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and   
   ("time"(dateend) >= cast(to_char(8.00*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((8+0.30)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'OUTGOING' ) as outcount,

   (select count(*) from table   
   where   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and 
   ("time"(dateend) >= cast(to_char(8*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((8+0.30)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'INCOMING' ) as inccount
   
   union all

select 8.30 as hour,
   
   (select count(*) from table   
   where 
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and   
   ("time"(dateend) >= cast(to_char((8 + 0.30)*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((8+1)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'OUTGOING') as outcount,

   (select count(*) from table   
   where   
   datebegin between '2015-02-13 00:00:00' and '2015-02-13 23:59:59' and 
   ("time"(dateend) >= cast(to_char((8 + 0.30)*100, 'FM99909:99')AS 
   time without time zone) and "time"(dateend) < cast(to_char((8+1)*100, 'FM99909:99')AS 
   time without time zone)) and operator in(7, 8,9,10,11) and calltype = 'INCOMING') as inccount

  
   ) un
   order by un.hour
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895907
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часы я определяю так
Код: sql
1.
2.
3.
4.
5.
select row_number() over() as userid,(extract(hour from datebegin)) as hour
 from table un
where  (extract(hour from datebegin))::integer % 2 = 0 and operator= 10
group by hour
order by hour
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895908
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но как их связать? Чтоб все данные были вместе
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38895963
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, подскажите, пожалуйста! Очень нужно
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38896184
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-то жаловался на хромые описания вопроса, а теперь что не так? (((((
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38896197
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Philip_StubbornКто-то жаловался на хромые описания вопроса, а теперь что не так? (((((

> набор тестовых данных и желаемый результат ...
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905291
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, подскажите, пожалуйста, как вот этот запрос можно переделать, чтоб было без таблицы calls_charts_data
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
-- Function: calls_charts_hour_data(timestamp without time zone, timestamp without time zone, text)

-- DROP FUNCTION calls_charts_hour_data(timestamp without time zone, timestamp without time zone, text);

CREATE OR REPLACE FUNCTION calls_charts_hour_data(datefrom timestamp without time zone, dateto timestamp without time zone, useridslist text)
  RETURNS void AS
$BODY$
DECLARE
  sql VARCHAR;
  hours DOUBLE PRECISION[];  
  days INTEGER[];  
  months INTEGER[];
BEGIN
       DELETE FROM calls_charts_data WHERE type = 'charts';
           hours := ARRAY( SELECT inn.hour FROM (SELECT (EXTRACT(DAY FROM datebegin)) AS day, (EXTRACT(HOUR FROM datebegin)) AS hour
                           FROM call un
                            WHERE caller = ANY(string_to_array(userIdsList, ',')::INTEGER[]) AND datebegin BETWEEN dateFrom AND dateTo
                             GROUP BY day, hour
                              ORDER BY day, hour) inn);
 
           days := ARRAY( SELECT inn.day FROM (SELECT (EXTRACT(DAY FROM datebegin)) AS day, (EXTRACT(HOUR FROM datebegin)) AS hour
                          FROM call un
                           WHERE caller = ANY(string_to_array(userIdsList, ',')::INTEGER[]) AND datebegin BETWEEN dateFrom AND dateTo
                            GROUP BY day, hour
                             ORDER BY day, hour) inn);

           months := ARRAY( SELECT inn.month FROM (SELECT (EXTRACT(MONTH FROM datebegin)) AS month, (EXTRACT(HOUR FROM datebegin)) AS hour
                          FROM call un
                           WHERE caller = ANY(string_to_array(userIdsList, ',')::INTEGER[]) AND datebegin BETWEEN dateFrom AND dateTo
                            GROUP BY month, hour
                             ORDER BY month, hour) inn);                             

IF (array_length(hours, 1) > 0) THEN 

   FOR i IN 1..array_length(hours, 1) LOOP
    INSERT INTO calls_charts_data (hour, outcount, inccount, type) 
       SELECT un.*, 'charts' AS type FROM    
                     (SELECT hours[i] AS hour,
                               (SELECT count(*) FROM call 
                            WHERE 
                              datebegin BETWEEN dateFrom AND dateTo AND (EXTRACT(DAY FROM datebegin)) = days[i] AND (EXTRACT(MONTH FROM datebegin)) = months[i] AND 
                               ("time"(dateend) >= CAST(to_char(hours[i]*100, 'FM99909:99')AS
                               TIME WITHOUT TIME ZONE) AND "time"(dateend) < CAST(to_char((hours[i]+1)*100, 'FM99909:99')AS 
                               TIME WITHOUT TIME ZONE)) AND caller = ANY(string_to_array(userIdsList, ',')::integer[]) AND calltype = 'OUTGOING' ) AS outcount,
                           
                               (SELECT count(*) FROM call 
                               WHERE
                               datebegin BETWEEN dateFrom AND dateTo AND (EXTRACT(DAY FROM datebegin)) = days[i] AND (EXTRACT(MONTH FROM datebegin)) = months[i] AND 
                               ("time"(dateend) >= CAST(to_char(hours[i]*100, 'FM99909:99')AS 
                               TIME WITHOUT TIME ZONE) AND "time"(dateend) < cast(to_char((hours[i]+ 1)*100, 'FM99909:99')AS 
                               TIME WITHOUT TIME ZONE)) AND caller = ANY(string_to_array(userIdsList, ',')::integer[])  AND calltype = 'INCOMING' ) AS inccount 
                                                            
                               ) un 
                               ORDER BY un.hour;
                               
   END LOOP;
 END IF;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION calls_charts_hour_data(timestamp without time zone, timestamp without time zone, text)
  OWNER TO postgres;
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905309
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные данные
Таблица call имеет такой вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
datebegin (timestamp without time zone)   dateend (timestamp without time zone)   calltype (character varying)
        2015-03-13 12:07:05.427                           2015-03-13 12:08:30.587              INCOMING
        2015-03-13 12:09:07.38                            2015-03-13 12:09:22.62               INCOMING
        2015-03-13 14:22:04.614                           2015-03-13 14:22:41.654              INCOMING
        2015-03-13 16:18:18.192                           2015-03-13 16:18:23.192              OUTGOING
        2015-03-13 14:07:35.708                           2015-03-13 14:08:01.108              INCOMING
        2015-03-13 16:19:35.974                           2015-03-13 16:20:00.694              INCOMING



Выходная таблица создается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE calls_charts_data
(
  hour double precision,
  outcount integer,
  inccount integer,
  id bigint,
  type text,  
)



Данные вставляются в результате выполнения программы
Код: sql
1.
2.
3.
4.
5.
6.
insert into calls_chart_data(id, hour, outcount, inccount, type) values (11 0 33 89311 'charts');
insert into calls_chart_data(id, hour, outcount, inccount, type) values (12 0 500 89312 'charts');
insert into calls_chart_data(id, hour, outcount, inccount, type) values (13 0 230 89313 'charts');
insert into calls_chart_data(id, hour, outcount, inccount, type) values (14 0 540 89314 'charts');
insert into calls_chart_data(id, hour, outcount, inccount, type) values (15 0 432 89315 'charts');
insert into calls_chart_data(id, hour, outcount, inccount, type) values (16 0 385 89316 'charts');
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905312
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желаемый вид это получившаяся таблица call_charts_data
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905313
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, помогите, пожалуйста
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905319
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Philip_StubbornРебят, помогите, пожалуйста
не в яслях, чать.

что сделать то нужно ?

как назло -- у всех вопрошающих фефект фикции, а у меня хрустальные шары вспотели -- не видать нихера.

если вернуть табличный набор, вместо заполнения таблицы -- то всё для сборки у вас под рукой, даже думать не надо. только RTFM малёхо.
есть варианты - хранимка, returning table AS (ваш лист), или фиксированный набор на фиксированных параметрах -- просто запросом.

если ещё что-то другое нать -- то что именно.

но делать механические преобразования за вас -- как-то в лом. и пользы мало, и вообще. остыл я что-то.
т.ч. иди, мальчик, куй, пока горячий.
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905374
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сильно подозреваю, что товарищу нужно просто сгруппировать данные по интервалам.

делается это просто. пишется запрос, который возвращает все интервалы в нужном промежутке, точнее говоря timestamp начала интервала, чтобы не делать какие-то ужасные касты.

дальше это все соединяется с таблицей (в сложных случаех с lateral), группируется и готово. как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with intervals as
(select * from generate_series('2015-03-15', '2015-10-21', interval '30 minutes') as g(datebegin))

select intervals.datebegin,
count(*),
sum(case when mytype = 1 then 1 else 0 end) as type1count

from intervals left join mytable
on mytable.datebegin > intervals.datebegin and mytable.dateend < intervals.datebegin + interval '30 minutes'
group by 1
order by 1
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905577
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexius,
Спасибо, друг! Классная вещь!
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905718
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, можете подсказать, как написать один запрос, в котором не будет этого цикла, но можно было его заменить в простом sql-запросе?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
oper := ARRAY (SELECT id FROM usertable ut
                    INNER JOIN user_roles ur ON ur.userid = ut.id AND ur.roleid = 4);

IF (array_length(oper, 1) > 0) THEN 
   FOR i IN 1..array_length(oper, 1) LOOP
   opername := (SELECT fullname FROM usertable WHERE id = oper[i]);      
    INSERT INTO calls_charts_data (eventtime, event, operator, eventdate, opername, eventtype, type) 
                  SELECT *, 'name', 0, 'events' as type from (
                  
                         SELECT EXTRACT(HOUR FROM datebegin)||':'||EXTRACT(MINUTE FROM datebegin)||':'||EXTRACT(SECOND FROM datebegin)::integer, 
                                name, c.caller AS caller, c.datebegin AS datebegin FROM critical_events ce, table1 c, table2 cr, table3 cp 
                          WHERE ce.id = 2 AND cp.cp_cat_id IN (8,9,10) AND cp.cp_cat_id <> 3 AND c.guid = cp.cp_call_id AND c.guid = cr.callid ) as un 
 end loop;
end if; 
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905768
Джо Ин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Philip_Stubbornкак написать один запрос, в котором не будет этого цикла, но можно было его заменить в простом sql-запросе?Получить селектом весь требуемый набор.
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905781
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Philip_StubbornРебят, можете подсказать, как написать один запрос, в котором не будет этого цикла, но можно было его заменить в простом sql-запросе?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
oper := ARRAY (SELECT id FROM usertable ut
                    INNER JOIN user_roles ur ON ur.userid = ut.id AND ur.roleid = 4);

IF (array_length(oper, 1) > 0) THEN 
   FOR i IN 1..array_length(oper, 1) LOOP
   opername := (SELECT fullname FROM usertable WHERE id = oper[i]);      
    INSERT INTO calls_charts_data (eventtime, event, operator, eventdate, opername, eventtype, type) 
                  SELECT *, 'name', 0, 'events' as type from (
                  
                         SELECT EXTRACT(HOUR FROM datebegin)||':'||EXTRACT(MINUTE FROM datebegin)||':'||EXTRACT(SECOND FROM datebegin)::integer, 
                                name, c.caller AS caller, c.datebegin AS datebegin FROM critical_events ce, table1 c, table2 cr, table3 cp 
                          WHERE ce.id = 2 AND cp.cp_cat_id IN (8,9,10) AND cp.cp_cat_id <> 3 AND c.guid = cp.cp_call_id AND c.guid = cr.callid ) as un 
 end loop;
end if; 



Если меня не подводит зреня то этот цикл просто N (где N - количество элементов массива oper) раз выполняет один и тот же insert запрос. Точно ли это то что автор хочет?

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905827
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
Нет, к сожалению, Вы не так поняли ((
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905833
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
opers - массив из id операторов,
но для каждого id отдельно нужно вычислить это

Код: sql
1.
2.
3.
4.
5.
 SELECT *, 'name', 0, 'events' as type from (
                  
                         SELECT EXTRACT(HOUR FROM datebegin)||':'||EXTRACT(MINUTE FROM datebegin)||':'||EXTRACT(SECOND FROM datebegin)::integer, 
                                name, c.caller AS caller, c.datebegin AS datebegin FROM critical_events ce, table1 c, table2 cr, table3 cp 
                          WHERE ce.id = 2 AND cp.cp_cat_id IN (8,9,10) AND cp.cp_cat_id <> 3 AND c.guid = cp.cp_call_id AND c.guid = cr.callid ) as un
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38905840
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получится ли у меня то же самое с этим запросом:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with  opers as (SELECT id, fullname FROM usertable ut
                    INNER JOIN "analyze".user_roles ur ON ur.userid = ut.id AND ur.roleid = 4), datas as
( SELECT *, 'name', 0, 'events' as type from (
                  
                         SELECT EXTRACT(HOUR FROM datebegin)||':'||EXTRACT(MINUTE FROM datebegin)||':'||EXTRACT(SECOND FROM datebegin)::integer, 
                                name, c.caller AS caller, c.datebegin AS datebegin FROM critical_events ce, table1 c, table2 cr, table3 cp, opers 
                          WHERE ce.id = 2 AND cp.cp_cat_id IN (8,9,10) AND cp.cp_cat_id <> 3 AND c.guid = cp.cp_call_id AND c.guid = cr.callid  and c.caller = opers.id) as un)

select * from datas
...
Рейтинг: 0 / 0
Что-то вроде циклических запросов или ....
    #38906043
Philip_Stubborn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, подскажите, пожалуйста, как сделать этот запрос.
Сделал как последний раз написал, но у меня выходит сумма по всем операторам, а нужно чтоб по всем операторам отдельно было
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то вроде циклических запросов или ....
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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