Элегантный подход к получению первого значения из каждой группы без использования внешнего запроса - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь получить первое значение из каждой группы в моих данных.Однако я не люблю использовать внешний запрос / с предложением.Можете ли вы дать мне знать, как я могу написать это элегантным способом, не используя внешний запрос?

Я использовал внешний запрос, чтобы получить первое значение из каждой группы.Тем не менее, не могли бы вы помочь мне написать это в элегантной манере в том же SQL.Есть ли какая-нибудь функция, такая как Max, Min, которая даст нам первое значение, чтобы мне не нужно было писать этот внешний запрос

select * 
from (    
  select subject_id,hadm_id,
         rank() OVER (PARTITION BY subject_id ORDER BY row_id) AS BG_CG_number 
  from labevents
  where itemid in ('50809','50931','51529') 
    AND valuenum > 110 
    and hadm_id is not null
) t1 
where t1.bg_cg_number = 1

Пожалуйста, найдите скриншот ниже для текущего и ожидаемого результата enter image description here

1 Ответ

2 голосов
/ 03 апреля 2019

В производной таблице нет ничего плохого (он же подзапрос).

Собственный Postgres distinct on () достигнет того же самого и обычно быстрее, чем использование оконной функции (это не из-за производной таблицы, а из-за оконной функции):

Цитата из руководства

SELECT DISTINCT ON ( expression [, ...] ) сохраняет только первую строку каждого набора строк, где заданные выражения оцениваются как равные. Выражения DISTINCT ON интерпретируются с использованием тех же правил, что и для ORDER BY (см. Выше).

Обратите внимание, что «первая строка» каждого набора непредсказуема, если только ORDER BY не используется для того, чтобы требуемая строка появлялась первой.

Таким образом, ваш запрос можно переписать на:

select distinct on (subject_id) subject_id, hadm_id
from labevents
where itemid in ('50809','50931','51529') 
  AND valuenum > 110 
  and hadm_id is not null
order by subject_id, row_id;
...