【问题标题】:Select distinct records based on max(date) or NULL date根据 max(date) 或 NULL date 选择不同的记录
【发布时间】:2014-03-22 00:13:25
【问题描述】:

我正在尝试根据员工状态或最近的终止日期获取员工列表。如果员工处于活动状态,则终止日期将为 NULL。还有一些员工在我们组织内的多家公司工作过,我只想要最近公司的记录,无论是活跃的还是终止的。一个员工在不同公司也可能有不同的员工编号,因此必须根据 SSN (Fica) 编号进行选择。

这是一个原始数据集:

company employee    Fica    First_name  emp_status  Term_date
5       7026                Jason       T1          2013-09-16 00:00:00.000
500     7026                Jason       T1          2010-11-30 00:00:00.000
7       7026                Jason       T1          2009-07-31 00:00:00.000
2       90908               Jason       A1          NULL
505     293866              William     T1          2008-05-23 00:00:00.000
7       7243                Ashley      T1          2010-07-11 00:00:00.000
2       90478               Michael     T1          2013-01-11 00:00:00.000
500     90478               Michael     T1          2011-09-26 00:00:00.000
500     311002              Andreas     A1          NULL
3       365463              Matthew     A1          NULL
500     248766              Chris       T1          2007-04-23 00:00:00.000
500     90692               Kaitlyn     T1          2012-03-13 00:00:00.000
2       90692               Kaitlyn     A5          NULL
500     90236               Jeff        T1          2011-09-26 00:00:00.000
2       90236               Jeff        A1          NULL
2       90433               Nathan      T1          2012-03-26 00:00:00.000
500     90433               Nathan      T1          2011-09-26 00:00:00.000

这是我想要得到的结果:

company employee    Fica    First_name  emp_status  Term_date
2       90908               Jason       A1          NULL
505     293866              William     T1          2008-05-23 00:00:00.000
7       7243                Ashley      T1          2010-07-11 00:00:00.000
2       90478               Michael     T1          2013-01-11 00:00:00.000
500     311002              Andreas     A1          NULL
3       365463              Matthew     A1          NULL
500     248766              Chris       T1          2007-04-23 00:00:00.000
2       90692               Kaitlyn     A5          NULL
2       90236               Jeff        A1          NULL
2       90433               Nathan      T1          2012-03-26 00:00:00.000

感谢您提供的任何帮助。我需要在将通过 ODBC 连接到 Oracle 服务器的 SQL2005 服务器上运行它。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

如果所有日期都已填充,您可以使用“标准”not exists 查询来执行此操作。 NULLs 引入了一个问题,但是这个问题可以使用 coalesce() 来解决:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.employee = t.employee and
                        coalesce(t2.term_date, '9999-01-01') > coalesce(t.term_date, '9999-01-01)
                 );

注意:如果您需要在 Oracle 上使用此功能,则需要为日期常量使用不同的格式。

编辑:

解决此问题的另一种方法是使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by employee
                                order by (case when term_date is null then 0 else 1 end),
                                         term_date desc
                               ) as seqnum
      from table t
     ) t
where seqnum = 1;

选择“最后”行的规则嵌入在order by 子句中。将 NULL 值放在首位,然后按降序排列 term_date

【讨论】:

  • 抱歉,我不知道 row_number() over (partition by 在 Oracle 中也可用...
  • 我不知道合并函数可以处理日期。这以我需要的方式检索了信息。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2023-03-10
  • 2021-03-16
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多