create table emp
(
emp_id serial primary key,
emp_no integer,
emp_ref_no character varying(15),
emp_class character varying(15),
created_at timestamp,
created_by character varying(20)
);
create table emp_detail
(
emp_detail_id serial primary key,
emp_id integer,
class_no integer,
col1 JSONB,
col2 JSONB,
col3 JSONB,
created_at timestamp without time zone default now(),
created_by character varying(20),
constraint con_fk foreign key(emp_id) references emp(emp_id)
);
INSERT INTO emp(
emp_no, emp_ref_no, emp_class, created_by)
VALUES ('548251', '2QcW', 'abc', 'Nik');
INSERT INTO emp_detail(
emp_id, class_no, created_at,
created_by)
VALUES ( 1, 1, '2018-05-04 11:00:00',
'Nik');
INSERT INTO emp_detail(
emp_id, class_no, created_at,
created_by)
VALUES ( 1, 1, '2018-04-04 11:00:00',
'Nik');
INSERT INTO emp_detail(
emp_id, class_no, created_at,
created_by)
VALUES ( 1, 2, '2018-05-10 11:00:00',
'Nik');
INSERT INTO emp_detail(
emp_id, class_no, created_at,
created_by)
VALUES ( 1, 2, '2018-02-01 11:00:00',
'Nik');
我想显示相应的emp_id,emp_no,emp_ref_no以及emp_detail表的所有列。 Emp_detail表应按类no进行分组,并且应仅显示具有最大值(created_at)的记录 我正在尝试在上使用distinct,但没有给出期望的结果
select e.emp_id, e.emp_no, e.emp_ref_no, ed.* from emp e inner join emp_detail ed on e.emp_id=ed.emp_id
where emp_detail_id in(select distinct on (ed.class_no) ed.emp_detail_id
from emp_detail ed
order by ed.class_no, created_at desc) and e.emp_no=548251;
答案 0 :(得分:1)
这是您期望的吗?
|emp_id|emp_no|emp_ref_no|emp_detail_id|emp_id|class_no|col1 |col2 |col3 |created_at |created_by|
|------|------|----------|-------------|------|--------|------|------|------|-------------------|----------|
| 1|548251|2QcW | 1| 1| 1|[NULL]|[NULL]|[NULL]|2018-05-04 11:00:00|Nik |
| 1|548251|2QcW | 3| 1| 2|[NULL]|[NULL]|[NULL]|2018-05-10 11:00:00|Nik |
SELECT DISTINCT ON (ed.class_no)
e.emp_id, e.emp_no, e.emp_ref_no, ed.*
FROM
emp_detail ed
JOIN emp e ON e.emp_id = ed.emp_id
ORDER BY ed.class_no, ed.created_at DESC
如果要使用DISTINCT ON (any group)
,则必须按此组排序,然后在这些组中定义顺序。因此,您的组是class_no
,在class_no
中对行进行分组的条件是created_at
时间戳。因此,您的ORDER BY
子句是(class_no, created_at DESC)
。然后DISTINCT ON
精确过滤出每个有序组的第一行,在这种情况下,最近创建的最后一个是第一行。