2017-06-12 46 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 
相关问题