Czy można ograniczyć liczbę elementów w następującej funkcji string_agg
?PostgreSQL - string_agg z ograniczoną liczbą elementów
string_agg(distinct(tag),', ')
Czy można ograniczyć liczbę elementów w następującej funkcji string_agg
?PostgreSQL - string_agg z ograniczoną liczbą elementów
string_agg(distinct(tag),', ')
nie jestem świadomy, że można ograniczyć go w funkcji string_agg()
. Można ograniczyć go w inny sposób:
select postid, string_agg(distinct(tag), ', ')
from table t
group by postid
Następnie można zrobić:
select postid, string_agg(distinct (case when seqnum <= 10 then tag end), ', ')
from (select t.*, dense_rank() over (partition by postid order by tag) as seqnum
from table t
) t
group by postid
Dzięki. Wolę unikać kolejnych podkwerend. Prawdopodobnie uniknę użycia string_agg. – nickbusted
Aby limit the number of elements in the following string_agg()
, użyj LIMIT
w podkwerendzie:
SELECT string_agg(tag, ', ') AS tags
FROM (
SELECT DISTINCT tag
FROM tbl
-- ORDER BY tag -- optionally order to get deterministic result
LIMIT 123 -- add your limit here
) sub;
nocie, że podzapytanie nie jest problem z wydajnością. Wręcz przeciwnie:, jest to zwykle szybsze, nawet jeśli nie nakładasz maksymalnej liczby na LIMIT
, ponieważ funkcja grupowania DISTINCT
w funkcji agregującej jest droższa niż wykonanie w podzapytaniu dla wszystkich wierszy naraz.
Lub, aby uzyskać "100 najczęstsze znaczniki":
SELECT string_agg(tag, ', ') AS tags
FROM (
SELECT tag
FROM tbl
GROUP BY tag
ORDER BY count(*) DESC
LIMIT 100
) sub;
Istnieją dwa więcej sposobów.
1) stanowią tablicę z rzędów ograniczania go, a następnie łączyć w ciąg:
SELECT array_to_string((array_agg(tag))[1:3], ', ') FROM tbl
("Array [1: 3]" oznacza się elementy od 1 do 3 z tablicy)
2) łączyć wiersze w ciąg bez limitu, a następnie użyć „podciąg”, aby go przyciąć:
string_agg(distinct(tag),',')
Jeśli wiesz, że Twój „tag” pole nie może zawierać ,
znak, a następnie można wybrać cały tekst przed nth Występowanie swojej ,
SELECT substring(
string_agg(DISTINCT tag, ',')
from '(?:[^,]+,){1,3}')
FROM tbl
tego fragmentu będzie wybrać 3 lub mniej strun podzielonych przez ,
można dostarczyć resztę zapytania? Możesz osiągnąć swoje wyniki z podzapytaniem i 'row_number', ale możesz być w stanie uzyskać pracę z' limitem 'samodzielnie. – sgeddes
Nie możesz ograniczyć samej funkcji, ale rozwijając problem, dlaczego tego potrzebujesz? Może znajdziemy inny sposób. –
Czy możesz wyjaśnić to pytanie: Czy chcesz ograniczyć * rozmiar * lub * liczbę elementów *? –