Как обобщить или параметризировать запрос SQL - PullRequest
0 голосов
/ 08 марта 2019

У меня проблема с таблицей employee_det, где я классифицирую статус активного сотрудника по годам.Например, 1: сотрудник присоединился к 01-01-2017 и вышел из компании в 02-02-2018, затем он / она попадает под категорию 2017 года.

example2: Если сотрудник присоединился к 01-02-2018 ивыпущен в 01-15-2019, тогда ему будет не более 2018 года.

, если сотрудник присоединился к 01-01-2017, и он все еще продолжает работать в компании, тогда он должен упасть ниже 2019.

Я написал следующий запрос, который дает мне точные результаты, но в следующем году мне нужно добавить еще одну запись в условии WHERE, вместо этого есть какой-либо обобщенный способ решения этой проблемы.

select emp_id, ename, year(effective_start_date) as year_bucket 
from employee_det 
where worker_status = 'Active' 
  and manager_name like '%srinivas%'
  and (
        ( date(effective_start_date) <= '2017-12-31' 
         and date(effective_end_date)>='2017-12-31' ) 
        or 
        ( date(effective_start_date) <= '2018-12-31' 
         and date(effective_end_date)>='2018-12-31' ) 
        or
        ( date(effective_start_date) <= current_date() 
         and date(effective_end_date)>=current_date()
      )

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Похоже, вы хотите, чтобы начальный год для сотрудников, которые закончили, и текущий год для активных сотрудников.Итак:

select emp_id, ename,
       (case when effective_end_date > current_date
             then year(current_date)
             else year(effective_start_date)
        end) as year_bucket
from employee_det
where worker_status = 'Active' and
      manager_name like '%srinivas%';
0 голосов
/ 08 марта 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT emp_id, ename,
  EXTRACT(YEAR FROM IF(effective_end_date >= CURRENT_DATE, CURRENT_DATE, effective_start_date)) year_bucket
FROM `project.dataset.employee_det`
WHERE worker_status = 'Active' 
AND manager_name LIKE '%srinivas%'   

Вы можете проверить, поиграть с выше, используя фиктивные данные, как в примере ниже

#standardSQL
WITH `project.dataset.employee_det` AS (
  SELECT 1 emp_id, 'employee1' ename, DATE '2017-01-01' effective_start_date, DATE '2018-02-02' effective_end_date, 'Active' worker_status, 'srinivas' manager_name UNION ALL
  SELECT 2, 'employee2', '2018-01-02', '2019-01-15', 'Active', 'srinivas' UNION ALL
  SELECT 3, 'employee3', '2017-01-01', '2019-04-15', 'Active', 'srinivas' 
)
SELECT emp_id, ename,
  EXTRACT(YEAR FROM IF(effective_end_date >= CURRENT_DATE, CURRENT_DATE, effective_start_date)) year_bucket
FROM `project.dataset.employee_det`
WHERE worker_status = 'Active' 
AND manager_name LIKE '%srinivas%'  

с результатом

Row emp_id  ename       year_bucket  
1   1       employee1   2017     
2   2       employee2   2018     
3   3       employee3   2019     

Обновление - исключая сотрудников, чей начальный и конечный ГОД совпадают

Вы можете просто использовать одно "общее" предложение, как показано ниже

WHERE EXTRACT(YEAR FROM effective_start_date) != EXTRACT(YEAR FROM effective_end_date)     

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

#standardSQL
WITH `project.dataset.employee_det` AS (
  SELECT 1 emp_id, 'employee1' ename, DATE '2017-01-01' effective_start_date, DATE '2018-02-02' effective_end_date, 'Active' worker_status, 'srinivas' manager_name UNION ALL
  SELECT 2, 'employee2', '2018-01-02', '2019-01-15', 'Active', 'srinivas' UNION ALL
  SELECT 3, 'employee3', '2017-01-01', '2019-04-15', 'Active', 'srinivas' UNION ALL
  SELECT 4, 'employee4', '2017-01-01', '2017-04-15', 'Active', 'srinivas' 
)
SELECT emp_id, ename,
  EXTRACT(YEAR FROM IF(effective_end_date >= CURRENT_DATE, CURRENT_DATE, effective_start_date)) year_bucket
FROM `project.dataset.employee_det`
WHERE worker_status = 'Active' 
AND manager_name LIKE '%srinivas%'
AND EXTRACT(YEAR FROM effective_start_date) != EXTRACT(YEAR FROM effective_end_date)  

с результатом

Row emp_id  ename       year_bucket  
1   1       employee1   2017     
2   2       employee2   2018     
3   3       employee3   2019    

как видите - employee4 не входит ни в одну корзину

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