选择 PostgreSQL 中只存在一个唯一最大记录的位置

Selecting where only one unique max record exists in PostgreSQL

我有 2 个 table,第一个是 t_cuti table,第二个 table 是 t_cuti_adjust。第二个 table 从第一个 table.

中提取数据

第一 table : t_cuti

我的第二个table: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 ;
        v_unit alias for ;

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。限于 table 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