【问题标题】:How to find a specific date using Oracle SQL for employee in most current department?如何使用 Oracle SQL 为当前部门的员工查找特定日期?
【发布时间】:2016-04-25 19:47:27
【问题描述】:

我正在尝试确定在最近部门有记录的员工的最短生效日期(请参阅下面的数据)。我期待 2014 年 8 月 25 日的结果,但希望您的专家能提供一些帮助,帮助您解决问题。在同一数据中,该员工在部门 70260 工作了一段时间,然后短暂调到 70210,然后又回到 70260。生效日期 2014 年 8 月 25 日是该员工回来的日期,我'想看看是否有任何创造性的方法来编写 SQL 以显示某人在他们最近的部门中的最短日期。提前谢谢!!!

╔═══════════╦════════════╦════════╗
║  EMPLID   ║   EFFDT    ║ DEPTID ║
╠═══════════╬════════════╬════════╣
║ 000123338 ║ 10/25/2015 ║  70260 ║
║ 000123338 ║ 4/2/2015   ║  70260 ║
║ 000123338 ║ 2/24/2015  ║  70260 ║
║ 000123338 ║ 11/1/2014  ║  70260 ║
║ 000123338 ║ 8/25/2014  ║  70260 ║ <--- I need the SQL to show 8/25/2014
║ 000123338 ║ 4/27/2014  ║  70210 ║
║ 000123338 ║ 3/16/2014  ║  70210 ║
║ 000123338 ║ 3/6/2014   ║  70260 ║
║ 000123338 ║ 11/1/2013  ║  70260 ║
║ 000123338 ║ 1/24/2013  ║  70260 ║
║ 000123338 ║ 1/1/2013   ║  70260 ║
║ 000123338 ║ 11/1/2012  ║  70260 ║
║ 000123338 ║ 11/1/2011  ║  70260 ║
║ 000123338 ║ 8/1/2010   ║  70260 ║
║ 000123338 ║ 8/5/2009   ║  70260 ║
║ 000123338 ║ 7/1/2009   ║  70260 ║
║ 000123338 ║ 7/7/2008   ║  70260 ║
║ 000123338 ║ 5/5/2008   ║  70260 ║
║ 000123338 ║ 1/1/2008   ║  70260 ║
║ 000123338 ║ 10/29/2007 ║  70260 ║
╚═══════════╩════════════╩════════╝

【问题讨论】:

    标签: sql oracle oracle11g greatest-n-per-group


    【解决方案1】:

    你需要找到第一组行:

    SELECT EMPLID, MIN(first_dates)
    FROM
     (
        SELECT EMPLID, EFFDT, DEPTID,
           CASE -- check if all previous rows return the same value
              WHEN MIN(DEPTID) OVER (PARTITION BY EMPLID ORDER BY EFFDT DESC ROWS UNBOUNDED PRECEDING)
                 = MAX(DEPTID) OVER (PARTITION BY EMPLID ORDER BY EFFDT DESC ROWS UNBOUNDED PRECEDING)
              THEN EFFDT
           END AS first_dates -- all other rows return NULL
        FROM tab
     ) dt
    GROUP BY 1;
    

    如果您想要完整的行,您需要添加另一个 ROW_NUMBER:

    SELECT ...
    FROM
     (
       SELECT ...,
          ROW_NUMBER() OVER (PARTITION BY EMPLID ORDER BY first_dates) AS rn
       FROM
        (
           SELECT EMPLID, EFFDT, DEPTID,
              CASE
                 WHEN MIN(DEPTID) OVER (PARTITION BY EMPLID ORDER BY EFFDT DESC ROWS UNBOUNDED PRECEDING)
                    = MAX(DEPTID) OVER (PARTITION BY EMPLID ORDER BY EFFDT DESC ROWS UNBOUNDED PRECEDING)
                 THEN EFFDT
              END AS first_dates
           FROM tab
        ) dt
     ) dt
    WHERE rn = 1
    

    【讨论】:

      【解决方案2】:

      你可以这样做

      select * from 
      (select empid,effdt,deptid,
       row_number() over ( partition by deptid order by effdt desc) as mostRecent
      from yourtable) a
      where a.mostRecent=1
      

      【讨论】:

        【解决方案3】:

        您可以结合使用窗口聚合函数和最终的全局聚合:

        select   empid,
                 deptid,
                 min(effdt) min_effdt
        from     (select empid,
                         deptid,
                         row_number() over 
                             (partition by empid order by effdt desc) as rn1,
                         row_number() over 
                             (partition by empid, deptid order by effdt desc) as rn2
                  from   tbl) t
        where    rn1 = rn2
        group by empid,
                 deptid
        

        内部查询返回这些行号,外部查询从剩余记录(RN1=RN2)中获取最小日期。

        ╔═══════════╦════════════╦════════╦═════╦═════╦═══════════╗
        ║  EMPLID   ║   EFFDT    ║ DEPTID ║ RN1 ║ RN2 ║ MIN_EFFDT ║ 
        ╠═══════════╬════════════╬════════╬═════╬═════╬═══════════╣
        ║ 000123338 ║ 10/25/2015 ║  70260 ║  1  ║  1  ║           ║  
        ║ 000123338 ║  4/02/2015 ║  70260 ║  2  ║  2  ║           ║  
        ║ 000123338 ║  2/24/2015 ║  70260 ║  3  ║  3  ║           ║  
        ║ 000123338 ║ 11/01/2014 ║  70260 ║  4  ║  4  ║           ║  
        ║ 000123338 ║  8/25/2014 ║  70260 ║  5  ║  5  ║ 8/25/2014 ║  
        ║ 000123338 ║  4/27/2014 ║  70210 ║  6  ║  1  ╠═══════════╝  
        ║ 000123338 ║  3/16/2014 ║  70210 ║  7  ║  2  ║  
        ║ 000123338 ║  3/06/2014 ║  70260 ║  8  ║  6  ║  
        ║ 000123338 ║ 11/01/2013 ║  70260 ║  9  ║  7  ║  
        ║ 000123338 ║  1/24/2013 ║  70260 ║ 10  ║  8  ║  
        ║ 000123338 ║  1/01/2013 ║  70260 ║ 11  ║  9  ║  
        ║ 000123338 ║ 11/01/2012 ║  70260 ║ 12  ║ 10  ║  
        ║ 000123338 ║ 11/01/2011 ║  70260 ║ 13  ║ 11  ║  
        ║ 000123338 ║  8/01/2010 ║  70260 ║ 14  ║ 12  ║  
        ║ 000123338 ║  8/05/2009 ║  70260 ║ 15  ║ 13  ║  
        ║ 000123338 ║  7/01/2009 ║  70260 ║ 16  ║ 14  ║  
        ║ 000123338 ║  7/07/2008 ║  70260 ║ 17  ║ 15  ║  
        ║ 000123338 ║  5/05/2008 ║  70260 ║ 18  ║ 16  ║  
        ║ 000123338 ║  1/01/2008 ║  70260 ║ 19  ║ 17  ║  
        ║ 000123338 ║ 10/29/2007 ║  70260 ║ 20  ║ 18  ║  
        ╚═══════════╩════════════╩════════╩═════╩═════╝
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多