如何概括或参数化SQL查询

时间:2019-03-08 12:11:55

标签: sql google-bigquery

我的employee_det表存在问题,我在此表中按年对现役员工进行分类。 例如1:一名员工于2017年1月1日加入,并于2018年2月2日从公司释放,然后他/她跌入了2017年。

example2:如果一名员工于2018年1月2日加入并于2019年1月15日获释,那么他将处在2018年。

如果一名员工于2017年1月1日加入并且仍在公司继续任职,那么他必须属于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 个答案:

答案 0 :(得分:2)

您似乎想要结束员工的开始年份和活跃员工的当前年份。所以:

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%';

答案 1 :(得分:0)

以下是用于BigQuery标准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不包含在任何存储桶中