SQL ПРЕДЕЛ по количеству групп? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь реализовать функцию поиска с разбивкой на страницы по иерархическому набору данных.

Важно НЕ использовать внутренний выбор

Это моя таблица задач, я использование supermother_id для определения иерархических групп

| id | name     | mother_id | supermother_id | depth |
------------------------------------------------------
| 1  | Task 1   | null      | 1              | 1     |
| 2  | Task 1.1 | 1         | 1              | 2     |
| 3  | Task 2   | null      | 3              | 1     |
| 4  | Task 2.1 | 3         | 3              | 2     |

Теперь, скажем, я хочу запросить задачи, содержащие в своем имени «1», с ограничением до 2 результатов.

SELECT name 
FROM tasks
WHERE name LIKE '%1%' 
ORDER BY supermother_id
LIMIT 2

Это вернет me Task 1 и Task 1.1

Что я на самом деле хочу, так это чтобы он возвращал Task 1, Task 1.1 и Task 2.1, потому что первые два находятся в одной группе, я хочу LIMIT рассматривать их как единое целое.

Так как я хочу, чтобы LIMIT 2 возвратил 3 записей, LIMIT, вероятно, не тот инструмент ...

Итак, Я хочу, чтобы LIMIT учитывал только различные значения supermother_id, возможно ли это в одном запросе?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете использовать оконную функцию dens_rank, разделенную на supermother_id:

SELECT sub.*
FROM (
  select *, dense_rank() OVER  (ORDER BY supermother_id) from tasks
) sub
WHERE name like '%1%'
AND dense_rank <= 2;
0 голосов
/ 16 марта 2020

Если я правильно понимаю, вы можете использовать distinct on, чтобы получить один ряд на supermother_id:

SELECT DISTINCT ON (supermother_id) t.* 
FROM tasks t
WHERE t.name LIKE '%1%' 
ORDER BY supermother_id
LIMIT 0,2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...