Внутреннее соединение с использованием различных - PullRequest
0 голосов
/ 28 января 2019
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 и должна показывать только запись, в которой есть max (made_at), для которой я пытаюсь использовать различные, но не дает желаемого результата

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;

1 Ответ

0 голосов
/ 28 января 2019

Это то, что вы ожидаете?

|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       |

demo: db <> fiddle

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 точно отфильтровывает первую строку каждой упорядоченной группы, в этом случае последняя созданная последняя является первой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...