Как правильно сформировать оконную функцию в запрос?

Ссылка скопирована
1 ответ

Есть данные:

cat_id | ad_id | count 60     | 1     | 22 60     | 99    | 22 60     | 3     | 22 42     | 5     | 14 42     | 4     | 14 11     | 12    | 6 11     | 19    | 6 11     | 2     | 6

cat_id | ad_id | count 60 | 1 | 22 60 | 99 | 22 60 | 3 | 22 42 | 5 | 14 42 | 4 | 14 11 | 12 | 6 11 | 19 | 6 11 | 2 | 6

Как правильно добавить оконную функцию, чтобы получилось:

cat_id | ad_id | count | row_num 60     | 1     | 22    | 1 60     | 99    | 22    | 1 60     | 3     | 14    | 1 42     | 5     | 14    | 2 42     | 4     | 14    | 2 11     | 12    | 14   | 3 11     | 19    | 6     | 3 11     | 2     | 6     | 3

cat_id | ad_id | count | row_num 60 | 1 | 22 | 1 60 | 99 | 22 | 1 60 | 3 | 14 | 1 42 | 5 | 14 | 2 42 | 4 | 14 | 2 11 | 12 | 14 | 3 11 | 19 | 6 | 3 11 | 2 | 6 | 3

Это необходимо, чтобы дальше в запросе ограничение поставить по этому новому полю row_num, к примеру row_num < 3.

Простое ROW_NUMBER не прокатит, так как он порядковый ряд создает внутри каждого набора cat_id, а мне нужно чтобы он каждому набору навешивал порядковый номер при сортировке по count.

SELECT *, ROW_NUMBER() OVER(         PARTITION BY cat_id         ORDER BY count desc     ) AS row_num FROM tabl

SELECT *, ROW_NUMBER() OVER( PARTITION BY cat_id ORDER BY count desc ) AS row_num FROM tabl

Дополнительно:

С какого перепугу ROW_NUMBER? DENSE_RANK()

  • Akina, DENSE_RANK() сделает то что мне нужно, но по count.
  • В общем решил по другому. Я все ad_id собрал в array_agg(), так получил только по одной записи cat_id и count, и уже для них сделал обычный ROW_NUMBER() по count DESC.
    Теперь легко сделать нужную мне выборку и иметь все ad_id.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ирина WP Ответ

    Для того чтобы правильно сформировать оконную функцию в запросе, вам необходимо использовать ключевые слова OVER и PARTITION BY вместе с функциями агрегирования.

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

    Пример запроса на SQL с использованием оконной функции для подсчета суммы продаж по дням:

    SELECT
        DATE,
        SUM(amount) OVER (PARTITION BY DATE) AS total_sales
    FROM
        sales_table;

    SELECT date, SUM(amount) OVER (PARTITION BY date) as total_sales FROM sales_table;

    В этом запросе мы выбираем столбец с датой и используем функцию SUM() в комбинации с ключевыми словами OVER и PARTITION BY, чтобы вычислить сумму продаж для каждой даты отдельно.

    Таким образом, правильное формирование оконной функции в запросе позволит вам агрегировать данные в рамках определенных групп (например, дней, категорий и т. д.) без необходимости использования дополнительных подзапросов или временных таблиц.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно