Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要创建一个在日期之前填写值的表_Sql_Amazon Redshift - Fatal编程技术网

Sql 需要创建一个在日期之前填写值的表

Sql 需要创建一个在日期之前填写值的表,sql,amazon-redshift,Sql,Amazon Redshift,使用红移。我有一个包含以下字段的表: Column: Type: department | varchar employee_ID | varchar event | varchar date | date 还有一个日期表,它只有一个字段并列出所有日期。 有几个部门,每个部门都有员工。事件字段有两个可能的值:JOIN或LEAVE。加入记录是他们加入公司/部门的日期,休假记录是

使用红移。我有一个包含以下字段的表:

Column:         Type:
department    | varchar             
employee_ID   | varchar           
event         | varchar     
date          | date 
还有一个日期表,它只有一个字段并列出所有日期。 有几个部门,每个部门都有员工。事件字段有两个可能的值:JOIN或LEAVE。加入记录是他们加入公司/部门的日期,休假记录是他们离开公司/部门的日期。看起来是这样的:

department  employee_id event   date
marketing   001         JOIN    6/17/2017
marketing   002         JOIN    6/19/2017
marketing   002         LEAVE   6/20/2017
marketing   001         LEAVE   6/22/2017
date        department  employee_id employed
6/17/2017   marketing   001         1
6/18/2017   marketing   001         1
6/19/2017   marketing   001         1
6/19/2017   marketing   002         1
6/20/2017   marketing   001         1
6/20/2017   marketing   002         1
6/21/2017   marketing   001         1
6/22/2017   marketing   001         1
我想制作一个表,再次列出每天。我有一个表,其中包含所有日期,当他们被雇用时,值为1,当他们不是所有员工时,值为0。这看起来像这样:

department  employee_id event   date
marketing   001         JOIN    6/17/2017
marketing   002         JOIN    6/19/2017
marketing   002         LEAVE   6/20/2017
marketing   001         LEAVE   6/22/2017
date        department  employee_id employed
6/17/2017   marketing   001         1
6/18/2017   marketing   001         1
6/19/2017   marketing   001         1
6/19/2017   marketing   002         1
6/20/2017   marketing   001         1
6/20/2017   marketing   002         1
6/21/2017   marketing   001         1
6/22/2017   marketing   001         1
是否认为我可能需要创建一个新表,该表的开始日期和离开日期在同一行?为此,我可以使用case语句和分区来获得第一个和最后一个日期,但不确定从那里去哪里。。。也许是理货台?该查询可能如下所示,但仍无法获得所需的结果:

select
department,
employee_id,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY date ASC) = 1 THEN date
ELSE NULL
END AS join_date,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY date DESC) = 1 THEN date
ELSE NULL
END AS leave_date
from table1
您需要在日期表和包含联接和离开日期的表之间使用交叉联接

仅示例数据。您将使用现有的表

CREATE TEMP TABLE dim_date (dt_val)
AS        SELECT '2017-06-16'::date dt_val
UNION ALL SELECT '2017-06-17'::date dt_val
UNION ALL SELECT '2017-06-18'::date dt_val
UNION ALL SELECT '2017-06-19'::date dt_val
UNION ALL SELECT '2017-06-20'::date dt_val
UNION ALL SELECT '2017-06-21'::date dt_val
UNION ALL SELECT '2017-06-22'::date dt_val
UNION ALL SELECT '2017-06-23'::date dt_val
;
CREATE TEMP TABLE empl_event (department, employee_id, event, event_dt)
AS        SELECT 'marketing' department, 1 employee_id, 'JOIN'  event, '2017-06-17'::date event_dt
UNION ALL SELECT 'marketing' department, 2 employee_id, 'JOIN'  event, '2017-06-19'::date event_dt
UNION ALL SELECT 'marketing' department, 2 employee_id, 'LEAVE' event, '2017-06-20'::date event_dt
UNION ALL SELECT 'marketing' department, 1 employee_id, 'LEAVE' event, '2017-06-22'::date event_dt
;
逻辑步骤1:将加入和离开事件转换为一行上的日期

CREATE TEMP TABLE empl_period (department, employee_id, join_dt, leave_dt)
AS
SELECT department
      ,employee_id
      ,MAX(CASE WHEN event = 'JOIN'  THEN event_dt ELSE NULL END) join_dt
      ,MAX(CASE WHEN event = 'LEAVE' THEN event_dt ELSE NULL END) leave_dt
FROM empl_event
GROUP BY 1,2
;
逻辑步骤2:使用交叉联接为每个可能的员工日期组合创建一行,如果日期介于联接和离开之间,则将employee设置为1

例如输出数据

 department | employee_id |   dt_val   | employed
------------+-------------+------------+----------
 marketing  |           1 | 2017-06-16 |        0
 marketing  |           1 | 2017-06-17 |        1
 marketing  |           1 | 2017-06-18 |        1
 marketing  |           1 | 2017-06-19 |        1
 marketing  |           1 | 2017-06-20 |        1
 marketing  |           1 | 2017-06-21 |        1
 marketing  |           1 | 2017-06-22 |        1
 marketing  |           1 | 2017-06-23 |        0
 marketing  |           2 | 2017-06-16 |        0
 marketing  |           2 | 2017-06-17 |        0
 marketing  |           2 | 2017-06-18 |        0
 marketing  |           2 | 2017-06-19 |        1
 marketing  |           2 | 2017-06-20 |        1
 marketing  |           2 | 2017-06-21 |        0
 marketing  |           2 | 2017-06-22 |        0
 marketing  |           2 | 2017-06-23 |        0

您可以使用以下SQL来使用“到日期”和“从日期”展开日期

DECLARE @dateranges TABLE (employee_id VARCHAR(4),
                           department  VARCHAR(20),
                           join_date   DATE,
                           leave_date  DATE)

INSERT @dateranges SELECT employee_id,
                          department,
                          MIN(event_date) join_date,
                          MAX(event_date) leave_date
                     FROM employment
                    GROUP BY employee_id,
                             department;

WITH cte (dt, dept, id, emd) AS
(
   SELECT tbl.join_date AS dt,
          tbl.department AS dept,
          tbl.employee_id AS employee_id,
          1 AS emd
     FROM @dateranges tbl
    UNION ALL
   SELECT DATEADD(DAY, 1, cte.dt) AS dt,
          tbl.department AS dept,
          tbl.employee_id AS employee_id,
          1 AS emp
     FROM cte
    INNER JOIN @dateranges tbl
       ON cte.id = tbl.employee_id
      AND cte.dept = tbl.department
    WHERE cte.dt < tbl.leave_date
)

SELECT dt AS date,
       dept AS department,
       id AS employee_id,
       emd AS employed
  FROM cte
 ORDER BY dt, id

我用的是redshift,真正的文件太大了,无法手动输入工会的每个日期。。我还可以做其他事情吗?dim_date和Emp_event仅创建用于演示的示例数据。没有必要写任何工会。这看起来很棒,谢谢!有一个问题,我被告知交叉连接函数可以做到这一点,但在红移中似乎不可用。您是否知道交叉联接是红移中的运算符,或者是否有其他选择?此SQL不适用于红移。