选择PostgreSQL中仅存在一条唯一max记录的位置

选择PostgreSQL中仅存在一条唯一max记录的位置,postgresql,postgresql-11,Postgresql,Postgresql 11,我有两张桌子,第一张是t_cuti桌子,第二张是t_cuti_调整。其中,第二个表从第一个表中提取数据 第一张桌子:t_cuti 我的第二张桌子:t_cuti_adjust 这是目前的显示数据: 这是我的实验结果: 我在进行查询时遇到问题。我只想显示来自具有相同唯一字段nik的最大ID的数据 我的问题是: CREATE OR REPLACE FUNCTION public.fn_daftar_adjust_saldo( character varying, character

我有两张桌子,第一张是t_cuti桌子,第二张是t_cuti_调整。其中,第二个表从第一个表中提取数据

第一张桌子:t_cuti

我的第二张桌子:t_cuti_adjust

这是目前的显示数据:

这是我的实验结果:

我在进行查询时遇到问题。我只想显示来自具有相同唯一字段nik的最大ID的数据

我的问题是:

CREATE OR REPLACE FUNCTION public.fn_daftar_adjust_saldo(
    character varying,
    character varying)
    RETURNS SETOF record 
    LANGUAGE 'plpgsql'

    COST 100
    VOLATILE 
    ROWS 1000
AS $BODY$
DECLARE 
        rcd record;
        v_rumah_sakit alias for $1;
        v_unit alias for $2;

begin
for rcd in

select
    adj.id as id,
    cuti.nik as nik,
    nm_karyawan as nama_karyawan,
    nm_rs as rumah_sakit,
    nm_unit as unit,
    nm_jabatan as jabatan,
    cuti.saldo_cuti as saldo,
    adj.created_at as created_at
from
 --(select max(id) as id_tr, nik from t_cuti_adjust s group by s.nik ) x
 t_cuti cuti
 left join t_cuti_adjust adj on adj.nik=cuti.nik
 inner join m_karyawan kary on kary.nik=cuti.nik
 inner join m_rumah_sakit rs on rs.kd_rs=cuti.kd_rs
 inner join m_unit u on u.kd_unit=kary.kd_unit
 inner join m_jabatan j on j.kd_jabatan=kary.kd_jabatan

where 
case when v_rumah_sakit='' then 1=1 else nm_rs=v_rumah_sakit end
and case when v_unit='' then 1=1 else nm_unit=v_unit end

loop
return next rcd;
end loop;
/*
select * from fn_daftar_adjust_saldo('','') as (id bigint, nik character(9),nama_karyawan character varying,rumah_sakit character varying, unit character varying,jabatan character varying, saldo smallint, created_at timestamp with time zone)
*/
return;
end
$BODY$;

ALTER FUNCTION public.fn_daftar_adjust_saldo(character varying, character varying)
    OWNER TO postgres;
您可以使用DISTINCT ON进行此操作。仅限于表t_cuti,这意味着在您的情况下:

SELECT DISTINCT ON(nik) id, nik, saldo_cuti FROM t_cuti
ORDER BY nik, id DESC;
按id排序可确保始终使用id值最大的行。Postgres还要求根据DISTINCT ON子句的属性对具有排序的DISTINCT ON查询进行排序

您的查询应该如下所示:

SELECT DISTINCT ON(cuti.nik)
    adj.id as id,
    cuti.nik as nik,
    nm_karyawan as nama_karyawan,
    nm_rs as rumah_sakit,
    nm_unit as unit,
    nm_jabatan as jabatan,
    cuti.saldo_cuti as saldo,
    adj.created_at as created_at
FROM t_cuti cuti
 left join t_cuti_adjust adj on adj.nik=cuti.nik
 inner join m_karyawan kary on kary.nik=cuti.nik
 inner join m_rumah_sakit rs on rs.kd_rs=cuti.kd_rs
 inner join m_unit u on u.kd_unit=kary.kd_unit
 inner join m_jabatan j on j.kd_jabatan=kary.kd_jabatan

WHERE 
  case when v_rumah_sakit='' then 1=1 else nm_rs=v_rumah_sakit end
  and case when v_unit='' then 1=1 else nm_unit=v_unit end
ORDER BY cuti.nik, adj.id DESC

请删除图像,并将样本数据作为文本包含。然后,也告诉我们如何将这两个表连接在一起。对不起,我还是新来的,还没有尝试所有的工具。西尔,我还有更多的问题。我需要从中选择年份。我在select:EXTRACTyear FROM adj.created_at as year_created什么返回数据类型FREAR:select*FROM fn_…,as…,year_created?解决了这个问题,我必须为新列添加类型数据:EXTRACTyear FROM adj.tanggal_ins::int