postgresql 多條記錄合併一條,或取最新的一條數據

將一個表中的某一列的多行數據拼接成一行

一種方法

SELECT person_id AS job_no,
       string_agg(person_name,',') as str_person_name
       
FROM public.tb_attendance_model
WHERE create_time >= '2019-06-17 00:00:00.000000'
  AND create_time < '2020-06-17 00:00:00.000000'
GROUP BY person_id        
ORDER BY str_person_name DESC
LIMIT 10000;

去掉重複的,增加distinct

SELECT person_id AS job_no,
       string_agg(distinct(person_name),',') as str_person_name
       
FROM public.tb_attendance_model
WHERE create_time >= '2019-06-17 00:00:00.000000'
  AND create_time < '2020-06-17 00:00:00.000000'
GROUP BY person_id        
ORDER BY str_person_name DESC
LIMIT 10000;

 

如果要排序,就要使用第二種方法,array_agg

SELECT person_id AS job_no,
       string_agg(distinct(person_name),',') as str_person_name,
       array_to_string(array(select unnest(array_agg(person_name  order by create_time desc ))),',') as arr_person_name
FROM public.tb_attendance_model
WHERE create_time >= '2019-06-17 00:00:00.000000'
  AND create_time < '2020-06-17 00:00:00.000000'
GROUP BY person_id        
ORDER BY str_person_name DESC
LIMIT 10000;
 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

如果要取最新的一條數據, 則要用row_number()

select job_no, person_name from (
SELECT person_id AS job_no,	
	person_name,
       row_number() over(partition by person_id order by create_time desc) as ranks
FROM public.tb_attendance_model tam
WHERE tam.create_time >= '2019-06-17 00:00:00.000000'
  AND tam.create_time < '2020-06-17 00:00:00.000000'     
ORDER BY job_no DESC
LIMIT 10000) tb where ranks=1

或者用(array_agg(person_name order by create_time desc ))[1]

SELECT person_id AS job_no,
       string_agg(distinct(person_name),',') as str_person_name,
       (array_agg(person_name order by create_time desc ))[1] as arr_person_name
FROM public.tb_attendance_model
WHERE create_time >= '2019-06-17 00:00:00.000000'
  AND create_time < '2020-06-17 00:00:00.000000'
GROUP BY person_id        
ORDER BY str_person_name DESC
LIMIT 10000;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章