2017-06-12 14 views
0

我有一個包含大量日期和數據列中空值的表。我如何找到其中最棒的?從SQL中的一行中的不同列中選擇最高日期

表名是JOB_DATE_VALUES。對於不同分支機構的員工,這些列是JOB_START_DT,JOB_END_DT,JOB_PROMO_DT,JOB_DEMO_DT。我需要找到特定分支中員工的最大日期。該表格如下

ROW_ID EMP_NM DEPT_NM JOB_START_DT JOB_END_DT JOB_PROMO_DT JOB_DEMO_DT 
1-E4 123 SALES 11-NOV-2014    10-OCT-2015 
1-E5 234 FIN  01-JAN-2013    01-JAN-2015 

我使用了最少,最大,他們只返回NULL值。所以,請讓我知道。

+0

預期結果是什麼? –

+0

@vkp我需要在每個分支的員工可用日期中獲取最大日期。 –

+0

如果作者沒有顯示被嘗試的內容,爲什麼你會認爲他們嘗試了什麼?要麼要求提供一些特定的信息,要麼提出具體的改進,要麼停機後繼續前進。 –

回答

1

您可以使用greatest替代null的值。

select greatest(
nvl(to_date(JOB_START_DT,'DD-MON-YYYY'),to_date('01-01-1900','DD-MM-YYYY')) 
,nvl(to_date(JOB_END_DT,'DD-MON-YYYY'),to_date('01-01-1900','DD-MM-YYYY')) 
,nvl(to_date(JOB_PROMO_DT,'DD-MON-YYYY'),to_date('01-01-1900','DD-MM-YYYY')) 
,nvl(to_date(JOB_DEMO_DT,'DD-MON-YYYY'),to_date('01-01-1900','DD-MM-YYYY')) 
) as grtst_date 
from tbl 
1

要管理Null值,可以使用COALESCE表達式這是CASE表達式語法上的快捷方式:

GREATEST(
    COALESCE(JOB_START_DT, JOB_END_DT, JOB_PROMO_D, JOB_DEMO_DT), 
    COALESCE(JOB_END_DT, JOB_PROMO_D, JOB_DEMO_DT, JOB_START_DT), 
    COALESCE(JOB_PROMO_D, JOB_DEMO_DT, JOB_START_DT, JOB_END_DT), 
    COALESCE(JOB_DEMO_DT, JOB_START_DT, JOB_END_DT, JOB_PROMO_D) 
) 
1

你知道(或您發現本練習),最和GREATEST的工作方式與MIN和MAX不一樣。他們似乎也做同樣的事情,對於連續的值而不是列。但MIN和MAX忽略空值,而LEAST和GREATEST則不會。

利用MIN和MAX(而不是LEAST和GREATEST)的一種方法是UNPIVOT基表,然後使用標準聚合。但是,警告:基表中的數據已經按「行ID」分組。通過不透明,您將失去這些信息,並且Oracle需要再次分組,就好像數據未被分組一樣。這種方法的

select row_id, emp_nm, dept_nm, max(dt) as most_recent_date 
from job_date_values 
unpivot (dt for descr in (job_start_dt, job_end_dt, job_promo_dt, job_demo_dt)) 
group by row_id, emp_nm, dept_nm 
; 

ROW_ EMP_NM DEPT_NM MOST_RECENT_DATE 
---- ------ ------- ---------------- 
1-E4  123 SALES 10-OCT-2015  
1-E5  234 FIN  01-JAN-2015 

一個優點,不過,是你還可以包括是最近日期的類型(是的job_start_date?job_promo_date?等),你可以做到這一點通過向SELECT子句:

select row_id, ... , ... as most recent_date, 
     max(descr) keep (dense_rank last order by dt) as descr 
相關問題