选择 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
我有 2 个 table,第一个是 t_cuti
table,第二个 table 是 t_cuti_adjust
。第二个 table 从第一个 table.
第一 table : t_cuti
我的第二个table:t_cuti_adjust
这是目前的显示数据:
这是我的扩展结果:
我在查询时遇到了问题。我只想显示来自具有相同唯一字段 nik
.
我的查询:
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