Как сделать проверку раздела внутри раздела таблицы - PullRequest
1 голос
/ 02 апреля 2019

У меня есть таблица, как показано ниже enter image description here

Мне нужно добавить новый столбец с именем «FLAG», который выглядит так, как показано ниже

enter image description here

Логика позади столбца FLAG

  1. Join_date <= sys_assignment, тогда мне нужно дать FLAG «Y» для минимальной даты sys_assignment и оставить «N» (например, 101 и 103 записи) </p>

  2. Если join_date> sys_assignment (если какой-либо раздел удовлетворяет этому условию, в этом примере 102 и 104), рассматривают только эти записи (подраздел) и задают FLAG как «Y» для максимального значения sys_assignment, а остальные все «N» (Подразделы выделены ТОЛЩЫМИ цветами)

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

Ответы [ 3 ]

1 голос
/ 02 апреля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT empid, join_date, sys_assignment, 
  IF((option AND min_flag) OR (NOT option AND NOT grp AND max_flag), 'Y', 'N') flag
FROM (
  SELECT *, 
    join_date <= sys_assignment grp,  
    COUNT(1) OVER(PARTITION BY empid) = COUNTIF(join_date <= sys_assignment) OVER(PARTITION BY empid) option,
    sys_assignment = MIN(sys_assignment) OVER(PARTITION BY empid, join_date <= sys_assignment) min_flag, 
    sys_assignment = MAX(sys_assignment) OVER(PARTITION BY empid, join_date > sys_assignment) max_flag
  FROM `project.dataset.table`
)   

применительно к вашим образцам данных - приведенный выше запрос дает результат ниже (который выглядит для меня именно так, как и ожидалось)

enter image description here

0 голосов
/ 02 апреля 2019

Вероятно, можно было бы сделать это с разметкой, но мне легче читать таким образом. Посмотрите, нет ли записи с более высоким sys_assignment, чтобы получить самое низкое. Затем посмотрите, есть ли еще одна запись Нет одного случая.

Попробуйте это:

update mytable
set flag=case when not exists (select 'x' from mytable t where t.join_date=mytable.join_date and t.sys_assignment<mytable.sys_assignment) 
and exists (select 'x' from mytable t where t.join_date=mytable.join_date and t.sys_assignment>mytable.sys_assignment) 
then 'Y' else 'N' end
0 голосов
/ 02 апреля 2019

Вы можете использовать row_number():

select t.*,
       (row_number() over (partition by empid
                           order by (case when join_date < sys_assignment then 1 else 2 end),
                                    (case when join_date < sys_assignment then sys_assignment end) asc,
                                    (case when join_date < sys_assignment then NULL else sys_assignment end) desc
                          ) = 1
       ) as flag
from t;

Флаг здесь представлен как логическое значение, а не как символ, что больше подходит для BigQuery.

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