Невозможно получить одинаковое значение Min (date) для всех строк с одинаковым идентификатором user_id в SQL - PullRequest
1 голос
/ 04 мая 2019

У меня есть 4 столбца:

user_id,
job_date,
min (job_date),
rank.

Столбец, который не показывает, что яхочу это столбец min (job_date).В этом столбце я в основном пытаюсь вставить наименьшую дату для данного user_id.Т.е. если моя первая дата была 1-1-19, то эта дата должна отображаться во всех столбцах столбца min (job_date).

Вот код SQL:

SELECT  
user_id , 
job_date,
min(job_date),
rank() over(PARTITION BY user_id ORDER BY job_date ASC) AS rank
FROM abc
group by 1,2;

таблица выглядит следующим образом: enter image description here

Проблема: min_job_date от 2019-04-29T13: 24 отображается только для первой строки, но она должна отображаться для всех строк для одного и того же user_id,Что я делаю неправильно?Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Вы можете просто использовать одну и ту же оконную функцию (хотя ORDER BY не требуется), чтобы определить свой MIN(job_date) для каждого пользователя. Как было отмечено @GordonLinoff, при использовании оконной функции, вероятно, нет необходимости использовать GROUP BY сейчас, если только у данного пользователя не может быть более одной работы, начинающейся с данной job_date.

SELECT user_id , 
       job_date,
       MIN(job_date) over (PARTITION BY user_id) AS min_job_date,
       RANK() over(PARTITION BY user_id ORDER BY job_date ASC) AS `rank`
FROM abc
GROUP BY 1,2;
1 голос
/ 04 мая 2019

Вы не показали свои данные, но вам действительно нужно агрегирование? То есть есть ли повторяющиеся строки для данного пользователя на данную дату? Или GROUP BY была просто вашей попыткой получить минимум.

Я подозреваю, что последнее, так что это может делать то, что вы хотите:

SELECT user_id, job_date,
       MIN(job_date) OVER (PARTITION BY user_id) as min_job_date,
       ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY job_date ASC) AS seqnum
FROM abc;

Я заменил RANK() на ROW_NUMBER(), поскольку предполагается, что дубликатов нет.

0 голосов
/ 04 мая 2019

Проблема в том, что вы группируете по user_id и job_date, поэтому вы получаете минимальное значение job_date для job_date ... переключиться на group by 1.

Однако, это само по себе вернет толькоминимальная дата задания для пользователя, если вы хотите получить минимальный столбец во всех строках, вам нужно присоединить его к результирующему набору:

SELECT  
abc.user_id , 
job_date,
min_job_date,
rank() over(PARTITION BY abc.user_id ORDER BY job_date ASC) AS rank
FROM abc inner join (
  select user_id, min(job_date) as min_job_date 
  from abc group by user_id
) mjd on abc.user_id = mjd.user_id;
...