2016-12-12 5 views
0

В PSQL Я агрегационный сцепленные строки из таблицы с именем genus_synonymработы со строками внутри string_agg

Пример таблицы выглядит следующим образом

id|genus_synonym|specific_epithet_synonym 
---|----------|----------- 
1 | Acer | rubrum 
2 | Acer | nigrum 
3 | Betula | lenta 
4 | Carya | ovata 
5 | Carya | glabra 
6 | Carya | tomentosa 

here is an image of my table if that is easier

код, который я использую, выглядит следующим образом:

Select 

string_agg(CONCAT(CONCAT(s."genus_synonym"), ' ', s.specific_epithet_synonym), ', ')as syno 

FROM 

"public"."synonyms" as s 

Результат:
Acer гиЬгит, Acer шдгит, Betula Lenta, Кария яйцевидная, Кария голая, Carya войлочная

То, что я пытаюсь выяснить, если можно вместо этого производят следующим образом:

Acer гиЬгит, А. шдгит, Betula Lenta, Кария яйцевидная, С. голый, С. войлочной

в основном я хотел сокращайте название рода, к одной букве с периодом после него, для второго и дополнительного время повторяется.

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

Кроме того, это не похоже, что кто-то отвечает на мой вопрос. Разве это не ясно? Раньше я не мог найти ничего подобного. Пожалуйста, дайте мне знать, что я могу сделать, чтобы сделать этот вопрос лучше.

ответ

0

QRY:

t=# with a as (
    select *,case when row_number() over (partition by genus_synonym) > 1 and count(1) over (partition by genus_synonym) > 1 then substr(genus_synonym,1,1)||'.' else genus_synonym end sh 
    from s92 
) 
select string_agg(concat(sh,' ',specific_epithet_synonym),',') 
from a; 
           string_agg 
----------------------------------------------------------------------- 
Acer rubrum,A. nigrum,Betula lenta,Carya ovata,C. glabra,C. tomentosa 
(1 row) 

Time: 0.353 ms 

макете ваши данные:

t=# create table s92 (id int,genus_synonym text,specific_epithet_synonym text); 
CREATE TABLE 
Time: 7.587 ms 
t=# copy s92 from stdin delimiter '|'; 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> 1 | Acer | rubrum 
2 | Acer | nigrum 
3 | Betula | lenta 
4 | Carya | ovata 
5 | Carya | glabra 
6 | Carya | tomentosa 
>> >> >> >> >> >> \. 
COPY 6 
Time: 6308.728 ms