Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то вроде циклических запросов или .... / 25 сообщений из 33, страница 1 из 2
05.03.2015, 13:04
    #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
05.03.2015, 13:14
    #38895866
Что-то вроде циклических запросов или ....
репрезентативный юзабильный набор тестовых данных и желаемый результат на них резко повышает шансы на быстрый и правильный ответ. особенно, когда словесное описание хотелки хромает на обе ноги.
...
Рейтинг: 0 / 0
05.03.2015, 13:24
    #38895886
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Добрый Э - Эх,
...
Рейтинг: 0 / 0
05.03.2015, 13:28
    #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
05.03.2015, 13:29
    #38895901
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Но этот запрос у меня работает только с константами 8, 8.30 и т.д.
...
Рейтинг: 0 / 0
05.03.2015, 13:30
    #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
05.03.2015, 13:31
    #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
05.03.2015, 13:32
    #38895908
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Но как их связать? Чтоб все данные были вместе
...
Рейтинг: 0 / 0
05.03.2015, 13:59
    #38895963
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Ребят, подскажите, пожалуйста! Очень нужно
...
Рейтинг: 0 / 0
05.03.2015, 15:46
    #38896184
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Кто-то жаловался на хромые описания вопроса, а теперь что не так? (((((
...
Рейтинг: 0 / 0
05.03.2015, 15:51
    #38896197
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Philip_StubbornКто-то жаловался на хромые описания вопроса, а теперь что не так? (((((

> набор тестовых данных и желаемый результат ...
...
Рейтинг: 0 / 0
15.03.2015, 17:19
    #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
15.03.2015, 18:09
    #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
15.03.2015, 18:11
    #38905312
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Желаемый вид это получившаяся таблица call_charts_data
...
Рейтинг: 0 / 0
15.03.2015, 18:12
    #38905313
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Ребят, помогите, пожалуйста
...
Рейтинг: 0 / 0
15.03.2015, 18:48
    #38905319
?Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Philip_StubbornРебят, помогите, пожалуйста
не в яслях, чать.

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

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

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

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

но делать механические преобразования за вас -- как-то в лом. и пользы мало, и вообще. остыл я что-то.
т.ч. иди, мальчик, куй, пока горячий.
...
Рейтинг: 0 / 0
15.03.2015, 21:04
    #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
16.03.2015, 10:22
    #38905577
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Alexius,
Спасибо, друг! Классная вещь!
...
Рейтинг: 0 / 0
16.03.2015, 12:12
    #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
16.03.2015, 12:35
    #38905768
Джо Ин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Philip_Stubbornкак написать один запрос, в котором не будет этого цикла, но можно было его заменить в простом sql-запросе?Получить селектом весь требуемый набор.
...
Рейтинг: 0 / 0
16.03.2015, 12:41
    #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
16.03.2015, 13:18
    #38905827
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Maxim Boguk,
Нет, к сожалению, Вы не так поняли ((
...
Рейтинг: 0 / 0
16.03.2015, 13:20
    #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
16.03.2015, 13:24
    #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
16.03.2015, 16:02
    #38906043
Philip_Stubborn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то вроде циклических запросов или ....
Ребят, подскажите, пожалуйста, как сделать этот запрос.
Сделал как последний раз написал, но у меня выходит сумма по всем операторам, а нужно чтоб по всем операторам отдельно было
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то вроде циклических запросов или .... / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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