Я получаю пользовательские задачи в виде массива, используя функцию 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
Что такое сообщение об ошибке? Пожалуйста отредактируйте вопрос и добавьте его туда.
@LaurenzAlbe Я уже упоминал сообщение об ошибке о том, что оконные функции нельзя использовать в WHERE.
LIMIT
применяется после агрегации, так что это все равно не сработает, если вы пытаетесь ограничить размер массива. Попробуйте другой слой подзапроса.
@LaurenzAlbe Извините за беспокойство. Не могли бы вы добавить демо-код? потому что я старался изо всех сил, прежде чем добавить вопрос сюда, но не получил никакого решения.
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
) выполнялись без ошибок.
@user11666461 user11666461 нет, это не работает, я уже пробовал, но не знаю, почему он не применяет ограничение на массив задач.