Как можно максимально оптимизировать запрос?

У меня есть следующий код:

  • Он группирует юзеров по user_id, role_id, date_trunc('day', update)
  • Из каждой группы берет последнию запись по update
  • Далее эти последние записи дополнительно группирует по user_id, role_id, currency и берет так же последнюю запись из группы по update
  • Далее эти записи финально группирует по currency и суммирует поле amount

Как можно максимально оптимизировать этот запрос т.к. в данный момент на большой выборке он выполняется долго ?

WITH rankedUsers AS (
    SELECT 
        *, 
        ROW_NUMBER() OVER (PARTITION BY user_id, role_id, date_trunc('day', update) ORDER BY update DESC) AS rank
    FROM users
    WHERE 
        AND update < '2024-02-01 00:00:00'
),
lastRankedUsers AS (
    SELECT * 
    FROM rankedUsers 
    WHERE rank = 1
),
filteredUsers AS (
    SELECT 
        *, 
        ROW_NUMBER() OVER (PARTITION BY user_id, role_id, currency ORDER BY update DESC) AS filteredRank
    FROM lastRankedUsers
),
lastFilteredUsers AS (
    SELECT * 
    FROM filteredUsers 
    WHERE filteredRank = 1
)
SELECT 
    currency,
    SUM(amount) AS amount
FROM lastFilteredUsers 
GROUP BY currency;

Ответы (0 шт):