Как задать метку только для максимальных записей

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

У меня есть данные, как показано ниже,введите описание изображения здесь

Люди, которые присоединились к моей компании, будут назначаться с системой или ноутбуком, назначение также произойдет до присоединения

Мне нужно добавить еще один столбец «Updated_flag», который имеет значение флага «Y» для пользователей, чье joining_date_time> system_assign_time и это «Y» для максимального значения system_assign_time.

Для людей, чье присоединение_date_time

введите описание изображения здесь

для empid 101—> max (system_assign_time) это «2019-03-21 13:21:05 UTC», поэтому обновленный флаг «Y» для этой записи.

для empid 102—> max (system_assign_time) это «2018-0722 14:31:14 UTC», поэтому updated_flag равен «Y» для этой записи

для 103 изменений нет, потому что joining_date_time меньше, чем system_assign_time.

Пожалуйста, помогите мне в этом ..!

Спасибо

Ответ №1:

используйте скалярный подзапрос с CASE WHEN Expression

 select *,
case when system_assign_time=(select max(system_assign_time) 
      from tablename b where a.empid=b.empid ) then 'Y' else 'N' end as updated_flag
from tablename a
  

Комментарии:

1. Где joining_date_time> system_assign_time, для тех записей, которым требуется изменить статус флага только для других записей, это должен быть старый статус

Ответ №2:

Я думаю, вы можете использовать здесь функцию over()

 SELECT *, 
    CASE WHEN joining_date_time>system_assign_time THEN
        RANK() OVER (PARTITION BY emp_id ORDER BY system_assign_time DESC) 
    ELSE 2 
    END =1 AS flag 
FROM tablename
  

ПРИМЕЧАНИЕ: вместо ‘y’ и ‘n’ используется логическое значение, потому что это более уместно

Ответ №3:

Вы могли бы использовать объединение в группу максимального времени по empid

 select a.empid, a.joining_date_time, a.system_assign_time, a.flag
  , case when b.max_time = a.System_assign_time THEN 'Y' ELSE a.flag END update_flag
from  my_table a 
inner join  (
  select  empid, max(System_assign_time)  max_time
  from my_table 
  group by empid  
  ) on a.empid = b.empid 
  

Комментарии:

1. Где joining_date_time> system_assign_time, для тех записей, которым требуется изменить статус флага только для других записей, это должен быть старый статус

2. обновлен ответ @kalyan4uonly .. со старым флагом для других значений