Использование лимита в array_agg в Postgres

Я получаю пользовательские задачи в виде массива, используя функцию array_agg в postgres, но я хочу ограничить ее последними 10 задачами. Я не могу использовать LIMIT в подзапросе. Я также пытался использовать функцию row_number, но она выдает ошибку, что оконные функции нельзя использовать в WHERE.

Ниже приведен запрос, который я использую.

SELECT 
  *, 
  COUNT(*) OVER () as count 
FROM 
  (
    SELECT 
      *, 
      (
        SELECT 
          ARRAY_AGG(
            JSON_BUILD_OBJECT(
              'id', taskhistories.id, 'task', taskhistories.task, 
              'taskname', tasks.name, 'project', 
              taskhistories.project, 'projectname', 
              projects.name, 'started_at', taskhistories.started_at, 
              'stopped_at', taskhistories.stopped_at
            )
          ) as tasks 
        FROM 
          taskhistories 
          LEFT JOIN tasks ON taskhistories.task = tasks.id 
          LEFT JOIN projects ON taskhistories.project = projects.id 
        WHERE 
          users.id = taskhistories.user 
        -- LIMIT 10  this is something I want to achieve
      ) AS tasks 
    FROM 
      users 
    WHERE 
      isadmin IS NOT TRUE
  ) as users 
LIMIT 
  10 OFFSET 0

Запросы схемы

@user11666461 user11666461 нет, это не работает, я уже пробовал, но не знаю, почему он не применяет ограничение на массив задач.

Drashti Kheni 10.01.2023 06:07

Что такое сообщение об ошибке? Пожалуйста отредактируйте вопрос и добавьте его туда.

Laurenz Albe 10.01.2023 07:44

@LaurenzAlbe Я уже упоминал сообщение об ошибке о том, что оконные функции нельзя использовать в WHERE.

Drashti Kheni 10.01.2023 07:46
LIMIT применяется после агрегации, так что это все равно не сработает, если вы пытаетесь ограничить размер массива. Попробуйте другой слой подзапроса.
Laurenz Albe 10.01.2023 07:56

@LaurenzAlbe Извините за беспокойство. Не могли бы вы добавить демо-код? потому что я старался изо всех сил, прежде чем добавить вопрос сюда, но не получил никакого решения.

Drashti Kheni 10.01.2023 07:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

LIMIT выполняется после агрегации, так что это все равно не сработает. Попробуйте что-то подобное в своем подзапросе:

SELECT JSONB_AGG(t.task) as tasks 
FROM (SELECT JSONB_BUILD_OBJECT(
                'id', taskhistories.id,
                'task', taskhistories.task, 
                'taskname', tasks.name,
                'project', taskhistories.project,
                'projectname', projects.name,
                'started_at', taskhistories.started_at, 
                'stopped_at', taskhistories.stopped_at
             ) AS task
      FROM taskhistories 
          LEFT JOIN tasks ON taskhistories.task = tasks.id 
          LEFT JOIN projects ON taskhistories.project = projects.id 
      WHERE users.id = taskhistories.user
      LIMIT 10) AS t

Спасибо. Я проверил предоставленную вами схему, и мой подзапрос, и ваш исходный запрос (с LIMIT) выполнялись без ошибок.

Laurenz Albe 11.01.2023 08:41

Другие вопросы по теме