2014-12-10 15 views
5

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),', ') 
+1

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

+0

Nie możesz ograniczyć samej funkcji, ale rozwijając problem, dlaczego tego potrzebujesz? Może znajdziemy inny sposób. –

+0

Czy możesz wyjaśnić to pytanie: Czy chcesz ograniczyć * rozmiar * lub * liczbę elementów *? –

Odpowiedz

7

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 
+0

Dzięki. Wolę unikać kolejnych podkwerend. Prawdopodobnie uniknę użycia string_agg. – nickbusted

5

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;
1

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 ,

Powiązane problemy