2017-07-27 69 views
0

使用紅移。我有一個具有以下字段的表:需要創建一個在日期前填寫值的表格

Column:   Type: 
department | varchar    
employee_ID | varchar   
event   | varchar  
date   | date 

和只是有一個字段,並列出所有日期的日期表。 每個部門都有幾個部門有員工。 「事件」字段有兩個可能的值:JOIN或LEAVE。加入記錄是他們加入公司/部門的日期,並且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 

我想使已經每天上市(再次我有所有日期以及表)表以及何時使用它們的值1和0的值當他們不是全體員工時。這應該是這樣的:

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 
+0

即時通訊使用redshift – Berra2k

回答

-1

您需要使用您的CROSS JOIN表日期和包含加入和離開日期表之間。

僅限數據示例。你會使用你現有的表格。

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:將JOINLEAVE事件日期上的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步:使用CROSS JOIN創建一排每一個可能的僱員日期組合和設置employed 1如果日期在join_dtleave_dt之間。

SELECT emp.department 
     ,emp.employee_id 
     ,ddt.dt_val 
     ,CASE WHEN ddt.dt_val BETWEEN emp.join_dt AND emp.leave_dt THEN 1 ELSE 0 END employed 
FROM  empl_period emp 
CROSS JOIN dim_date ddt 
ORDER BY 1,2,3 
; 

例如數據輸出

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 
+0

真正的文件是方式t喲大到手動輸入該工會的每個日期..還有其他事情我可以做嗎? – Berra2k

+0

'dim_date'和'empl_event'僅爲演示創建示例數據。沒有必要寫任何工會。 –

-1

您可以使用下面的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 

結果和日期

日期以擴大:

date department employee_id employed 
2017-06-17 marketing 001 1 
2017-06-18 marketing 001 1 
2017-06-19 marketing 001 1 
2017-06-19 marketing 002 1 
2017-06-20 marketing 001 1 
2017-06-20 marketing 002 1 
2017-06-21 marketing 001 1 
2017-06-22 marketing 001 1 
+0

這看起來很棒謝謝你!有一個問題,我被告知一個交叉連接函數會做到這一點,但似乎並沒有在紅移中可用。你有任何想法,如果交叉加入是紅移的運營商,或者如果有其他選擇? – Berra2k

+0

此SQL不適用於Redshift。 –