Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 05.07.2016
Сообщений: 128
1

Создать цикл для даты в функции

24.02.2018, 14:31. Показов 7359. Ответов 4

Author24 — интернет-сервис помощи студентам
Добрый день, очень нужна помощь. есть таблица, в которую надо вставить или обнавить записи, которые надо подсчитать из другой таблицы. И эти записи нужно подсчитать для каждого дня начиная с определеного дня. И генерирую дни ставлю в цикл, но подсчеты не делаются((( пожалуйста, скажите как нужно делать. Спасибо за ранее

Oracle 11 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
65
66
67
68
69
CREATE 
    OR REPLACE FUNCTION sms.statistic_table_calculation_subscribers () RETURNS "pg_catalog"."bool" AS $BODY$
DECLARE
d_time RECORD;
 BEGIN
FOR d_time IN SELECT aa
        :: DATE 
    FROM
        generate_series ( TIMESTAMP WITHOUT TIME ZONE'2018-02-01', CURRENT_DATE, '1 day' ) 
     s ( aa )
    LOOP 
        INSERT INTO sms.statistic ( company_id, subscribers_count, unsubscribers_count, DATE, total_subscribers ) (
            WITH tm_zone AS (
            SELECT ID
                ,
                DATE (
                to_timestamp_from_utc ( d_time.aa, timezone )) AS date_timezone 
            FROM
                company 
            ),
            subs AS (
            SELECT
                company_id,
                tm_zone.date_timezone,
                COALESCE (
                    SUM (
                    CASE
                            
                            WHEN DATE ( created_at ) = tm_zone.date_timezone 
                            AND DATE ( updated_at ) = tm_zone.date_timezone 
                            AND disabled = 'f' THEN
                                1 
                                WHEN DATE ( created_at ) = tm_zone.date_timezone 
                                AND DATE ( updated_at ) = tm_zone.date_timezone 
                                AND unsubscribed_at IS NULL 
                                AND disabled = 't' THEN
                                    0 
                                END 
                                ),
                                0 
                            ) AS sub_count
                          
                                    FROM
                                        sms.subscriber
                                        JOIN tm_zone ON subscriber.company_id = tm_zone.ID 
                                    GROUP BY
                                        company_id,
                                        tm_zone.date_timezone 
                                    ) SELECT
                                    subs.company_id,
                                    subs.sub_count,
                                    subs.date_timezone AS date_timezone
                                FROM
                                    subs
                                GROUP BY subs.company_id,
                                    subs.sub_count,
                                    subs.date_timezone,
                                       ) ON conflict ( company_id, DATE ) DO
                            UPDATE 
                                SET company_id = excluded.company_id,
                                subscribers_count = excluded.subscribers_count,
                               DATE = excluded.DATE;
END LOOP;
                            RETURN TRUE;
                            EXCEPTION 
                            WHEN OTHERS THEN
                                RETURN FALSE;
                        
END $BODY$ LANGUAGE plpgsql VOLATILE COST 100
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2018, 14:31
Ответы с готовыми решениями:

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать...

Цикл: Не могу создать цикл для switch
не могу создать цикл для switch

Создать очередь для символов. Создать функции для ввода и вывода элементов
Создать очередь для символов. Максимальный размер очереди вводится с экрана. Создать функции для...

Создать класс Date для хранения даты
Народ, помогите пожалуйста. Тему проболел, не знаю как делать( Создайте класс с именем Date для...

4
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
24.02.2018, 17:38 2
У вас скорее проблема в большом запросе INSERT. Генерация выглядит правильной.
Проверяйте нагромождение SELECT'ов в INSERT, скорее всего там где-то проблема.
Например, делается пустая выборка, соответственно ничего вставляться и обновляться не будет.
1
0 / 0 / 0
Регистрация: 05.07.2016
Сообщений: 128
25.02.2018, 12:06  [ТС] 3
Когда пишу в место d_time.aa CURRENT_DATE, все работает.
Oracle 11 SQL
1
2
3
4
DATE (
                to_timestamp_from_utc ( CURRENT_DATE, timezone )) AS date_timezone 
            FROM
                company
Может подскажете, после генерации, в INSERT как правильно вставить переменную, чтоб все INSERT-ы делались для каждого дня, начиная с конкретного дня до CURRENT_DATE ?
0
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
25.02.2018, 15:12 4
Лучший ответ Сообщение было отмечено MariamG как решение

Решение

да правильно вы вставляете, проверьте хотя бы так, все должно выводить правильно

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE OR REPLACE FUNCTION statistic_table_calculation_subscribers () RETURNS "pg_catalog"."bool" AS 
$BODY$
DECLARE
  d_time record;
BEGIN
FOR d_time IN SELECT aa :: DATE 
    FROM
        generate_series ( TIMESTAMP WITHOUT TIME ZONE '2018-02-01', CURRENT_DATE, '1 day' ) 
     s ( aa )
    LOOP 
  raise notice '%', d_time.aa;
END LOOP;
RETURN TRUE;
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE COST 100
проверяйте вручную все запросы и подзапросы в insert. где-то ошибка в них.
1
0 / 0 / 0
Регистрация: 05.07.2016
Сообщений: 128
26.02.2018, 08:43  [ТС] 5
Большое спасибо
0
26.02.2018, 08:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2018, 08:43
Помогаю со студенческими работами здесь

Необходимо создать цикл расчета не для одной станции, а для всех (их всего 518) находящихся в файле.
Здравствуйте, у меня по циклу тоже есть вопрос, простая задача, но я туплю и не могу ее решить. ...

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции

Создать цикл для проверки
Помогите сделать проверку в таком коде ,нужно чтобы программа выводила максимальное и минимальное...

Создать диапазон для даты и времени и записать его в массив?
Здравствуйте Рабочий день начинается в понедельник в 10:00 и заканчивается в 19:00. С 13:00 до...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru