Как подгруппировать group_concat с лимитом в sqlite? - PullRequest
1 голос
/ 04 июня 2019

У меня есть очень простая таблица

create table foo (id int);
create table bar (id int, name text);

insert into foo(id) values (1), (2);
insert into bar(id, name) values (1, 'a'), (1, 'b'), (2, 'c'), (2, 'd'), (2, 'e');

, и я хочу объединить bar.name для каждого foo, но с ограниченным числом bar.name.

Например, чтобы ограничить 2, он должен вернуть

id | names
1  | a,b
2  | c,d

Без ограничения, я знаю, я могу просто написать это так

select id, group_concat(name) as names from foo natural join bar group by id;

И это просто дает мне

id | names
1  | a,b
2  | c,d,e

Но я понятия не имею, как ограничить name s, которые проходят мимо group_concat.

Также, как я могу заказать name s, которые проходят до group_concat?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

В более поздних версиях SQLite вы можете использовать оконные функции:

select f.id, group_concat(b.name) as names
from foo join
     (select b.*,
             row_number() over (partition by b.id order by b.id) as seqnum
      from bar b
     ) b
     on b.id = f.id
where seqnum <= 2
group by f.id;

Если вам нужно всего два значения, возможно, min() и max() делает то, что вы хотите:

select f.id, 
       (case when min(b.name) = max(b.name)
             then min(b.name)
             else min(b.name) || ',' || max(b.name)
        end) as names
from foo join
     bar b
     on b.id = f.id
group by f.id;

Поскольку вы сформулировали проблему, join не требуется:

select b.id, group_concat(b.name) as names
from (select b.*,
             row_number() over (partition by b.id order by b.id) as seqnum
      from bar b
     ) b
where seqnum <= 2
group by b.id;
0 голосов
/ 04 июня 2019

Использование подзапроса, который получает конкатенацию из другого ограниченного подзапроса, должно работать.

SELECT f.id,
       (SELECT group_concat(x.name)
               FROM (SELECT b.name
                            FROM bar b
                            WHERE b.id = f.id
                            ORDER BY b.name
                            LIMIT 2) x) names
      FROM foo f;

db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...