Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.09.2025
Сообщений: 2

Как упростить запрос?

25.09.2025, 15:27. Показов 1156. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно оптимизировать запрос?
Куда копать?

SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT DATE_TRUNC('day', dates)::DATE AS DATE,
SUM(CASE WHEN t2.id IS NOT NULL THEN t1.field1 ELSE 0 END) AS clicks,
SUM(CASE WHEN t2.id IS NOT NULL THEN t1.field2 ELSE 0 END) AS real_referrals,
SUM(CASE WHEN t2.id IS NOT NULL THEN t1.field3 ELSE 0 END) AS demo_referrals,
SUM(CASE WHEN t2.id IS NOT NULL THEN t1.field4 ELSE 0 END) AS deposits,
SUM(CASE WHEN t2.id IS NOT NULL THEN t1.field5 ELSE 0 END) AS commission
FROM GENERATE_SERIES('2023-05-01'::TIMESTAMP, '2023-05-31'::TIMESTAMP, '1 day'::INTERVAL) dates
LEFT JOIN table1 AS t1 ON DATE_TRUNC('day', t1.date)::DATE = dates
LEFT JOIN table2 AS t2 ON t1.t2_id = t2.id AND t2.user_id = '193491' AND t2.is_old = FALSE AND t2.banner_id IS NULL
GROUP BY DATE_TRUNC('day', dates)::DATE
ORDER BY 1;
Также есть индексы:

SQL
1
2
CREATE INDEX ix__table2__user_id ON table2(user_id);
CREATE INDEX ix__table1__date ON table1(DATE);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.09.2025, 15:27
Ответы с готовыми решениями:

Как упростить SQL запрос
Есть запрос на вывод 1...2...N максимальных значений из базы данных. Он работает. Но его надо...

Можно ли как то упростить данный запрос ?
Логика такая, вывести имя и фамилию прописными буквами, если курс равен 1 или 2 или 4. В противном...

Как упростить запрос?
INSERT INTO students VALUES (0062, 'Ivan', 26, 'Russia', 'Omsk', 'true'); INSERT INTO students...

4
74 / 18 / 6
Регистрация: 18.01.2025
Сообщений: 82
30.09.2025, 04:45
Вариантов упрощения много, например так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
WITH filtered_t2 AS (
    SELECT id 
    FROM table2 
    WHERE user_id = '193491' 
        AND is_old = FALSE 
        AND banner_id IS NULL
),
date_series AS (
    SELECT DATE_TRUNC('day', dt) AS DATE
    FROM GENERATE_SERIES('2023-05-01'::TIMESTAMP, '2023-05-31'::TIMESTAMP, '1 day'::INTERVAL) dt
)
SELECT 
    ds.date,
    SUM(CASE WHEN ft.id IS NOT NULL THEN t1.field1 ELSE 0 END) AS clicks,
    SUM(CASE WHEN ft.id IS NOT NULL THEN t1.field2 ELSE 0 END) AS real_referrals,
    SUM(CASE WHEN ft.id IS NOT NULL THEN t1.field3 ELSE 0 END) AS demo_referrals,
    SUM(CASE WHEN ft.id IS NOT NULL THEN t1.field4 ELSE 0 END) AS deposits,
    SUM(CASE WHEN ft.id IS NOT NULL THEN t1.field5 ELSE 0 END) AS commission
FROM date_series ds
LEFT JOIN table1 t1 ON DATE(t1.date) = ds.date
LEFT JOIN filtered_t2 ft ON t1.t2_id = ft.id
GROUP BY ds.date
ORDER BY ds.date;
0
2 / 2 / 0
Регистрация: 21.08.2025
Сообщений: 12
30.09.2025, 21:57
Добрый вечер.

SQL
1
SELECT DATE_TRUNC('day', dates):ATE AS DATE, и GROUP BY DATE_TRUNC('day', dates)::DATE
Функция GENERATE_SERIES возвращает дату без времени, использование DATE_TRUNC похоже лишнее.

1.
SQL
1
LEFT JOIN table1 AS t1 ON DATE_TRUNC('day', t1.date)::DATE = dates
В связке полей используется функция DATE_TRUNC, с функциями оптимизатор индекс не использует.
Если в table1 много записей, будут большие тормоза.
Решение примерно такое,
SQL
1
ON t1.date >= dates AND t1.date < dates + 1
С Postgres не работаю, возможно как-то так dates::date + 1 или по другому (прибавить день).
2. Внешние соединения менее оптимальные чем внутренние, как варианты переделать на внутренние или попробовать cross join lateral. В MSSQL с cross apply удавалось значительно ускорить работу запросов чем с left join.
0
 Аватар для iLinks
799 / 457 / 237
Регистрация: 03.01.2017
Сообщений: 1,337
14.10.2025, 13:17
Можно использовать конструкцию sum() filter
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
    dates::DATE AS DATE,
    SUM(t1.field1) FILTER (WHERE t2.id IS NOT NULL) AS clicks,
    SUM(t1.field2) FILTER (WHERE t2.id IS NOT NULL) AS real_referrals,
    SUM(t1.field3) FILTER (WHERE t2.id IS NOT NULL) AS demo_referrals,
    SUM(t1.field4) FILTER (WHERE t2.id IS NOT NULL) AS deposits,
    SUM(t1.field5) FILTER (WHERE t2.id IS NOT NULL) AS commission
FROM GENERATE_SERIES('2023-05-01'::DATE, '2023-05-31'::DATE, '1 day') dates
LEFT JOIN table1 t1 ON t1.date::DATE = dates
LEFT JOIN table2 t2 ON t1.t2_id = t2.id 
    AND t2.user_id = '193491' 
    AND t2.is_old = FALSE 
    AND t2.banner_id IS NULL
GROUP BY dates
ORDER BY DATE;
0
 Аватар для andrey_f
882 / 535 / 228
Регистрация: 21.02.2011
Сообщений: 5,706
14.10.2025, 14:21
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
SELECT 
    dates.date,
    COALESCE(SUM(t1.field1), 0) AS clicks,
    COALESCE(SUM(t1.field1), 0) AS real_referrals,
    COALESCE(SUM(t1.field3), 0) AS demo_referrals,
    COALESCE(SUM(t1.field4), 0) AS deposits,
    COALESCE(SUM(t1.field5), 0) AS commission
FROM (
    SELECT GENERATE_SERIES('2023-05-01'::DATE, '2023-05-31'::DATE, '1 day') AS DATE
) dates
LEFT JOIN (
    SELECT t1.* 
    FROM table1 t1
    WHERE EXISTS (
        SELECT 1 FROM table2 t2 
        WHERE t2.id = t1.t2_id 
        AND t2.user_id = '193491' 
        AND t2.is_old = FALSE 
        AND t2.banner_id IS NULL
    )
    AND t1.date >= '2023-05-01' AND t1.date < '2023-06-01'
) t1 ON t1.date::DATE = dates.date
GROUP BY dates.date
ORDER BY dates.date;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.10.2025, 14:21
Помогаю со студенческими работами здесь

Можно ли упростить запрос
Простая выборка но не могу придумать под неё простой sql запрос. Например, есть 2 таблицы товары,...

Упростить запрос
Добрый день уважаемые форумчане. Накидал такой запрос, вроде работает, но его реализация мне...

Упростить запрос
Здравствуйте! Есть такой запрос do $$ declare &quot;v_start&quot; integer = 202102; &quot;v_end&quot;...

Упростить запрос
Здравствуйте! Есть скрипт --Первый кусок запроса select column1, column2, column3,...

MS Access, SQL, Запрос в запросе, Ошибка "В качестве входных данных запрос должен иметь хотя бы одну таблицу или запрос"
Достаточно давно не работал с SQL, застрял на простом. Нужна помощь Схема данных ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru