获取上次更新的SQL值

时间:2016-10-25 19:13:41

标签: mysql

我有以下表结构..

emp_id  |  base_rate | base_sal | effective_on
1001      26.22        1200        2015-10-12
1001      26.00        1100        2015-11-12
1001      26.00        1100        2015-12-12
1002      18           1200        2015-10-12
1002      19           1100        2015-11-12

我需要查找每个base_rate

的最新更新effective_on emp_id日期

喜欢输出..

1001   26.00  1100 2015-11-12
1002   19     1100 2015-11-12

请参阅选择1001 2015-11-12,而不是2015-12-12这是最新的base_rate2015-11-12是相同的,因此之前有效{{1}}

我试过......一切......无法找到确切的查询..

3 个答案:

答案 0 :(得分:2)

这种方法简单易懂。

1) Assign rank for all the effective dates in descending order by partitioning  
   for each employee.
2) Select all the required fields for the last updated effective date from the 
   inner query and display the result.

SELECT emp_id,base_rate,base_sal
  FROM
     (
       SELECT *,
              ROW_NUMBER() OVER ( PARTITION BY emp_id ORDER BY effective_on DESC ) AS rn
         FROM table
      ) 
  WHERE rn = 1;

答案 1 :(得分:2)

一种方法是生成最大生效的员工子集并加入回基集。

在下面我们生成set" B"使用Emp_ID和ME(最大有效),然后我们连接回表中的整个数据集,并使用emp_ID和ME列限制基集中的数据并返回我们关心的所有列。

用英语填写 我们为所有雇员生成了一个只有最大生效日期的数据集,然后将这个数据集加入到基本集中,以限制基本集中的数据仅包含具有最近有效日期的员工的记录。

SELECT A.Emp_ID, A.Base_Rate, A.Base_Sal, min(C.Effective_On)
FROM Table A
INNER JOIN (SELECT emp_ID, Max(Effective_on) ME 
            FROM Table A 
            GROUP BY Emp_ID) B 
 on A.Emp_ID = B.Emp_ID 
and A.Effective_ON = B.ME
INNER JOIN TABLE C
  on C.Emp_ID = A.Emp_ID
 and C.Base_Rate= A.Base_rate
 and C.base_Sal = A.Base_Sal
GROUP BY A.Emp_ID, A.Base_Rate, A.Base_Sal

这或多或少与数据库无关,而row_number和limit对mySQL不起作用,因为它不支持窗口函数。

答案 2 :(得分:1)

您可以先为每位员工获取每个base_rate生效的最短日期,然后从那里获取最大值。以下是使用oracle中的row_number()执行此操作的方法:

with temp(emp_id, base_rate, base_sal, effective_on)
as (select 1001,      26.22,        1200,        '2015-10-12' from dual union all
    select 1001,      26.00,        1100,        '2015-11-12' from dual union all
    select 1001,      26.00,        1100,        '2015-12-12' from dual union all
    select 1002,      18,           1200,        '2015-10-12' from dual union all
    select 1002,      19,           1100,        '2015-11-12' from dual
)

SELECT emp_id,base_rate,base_sal,effective_on FROM(
  SELECT temp2.*,
    row_number() OVER (PARTITION BY EMP_ID ORDER BY effective_on DESC) AS rn2
    FROM
       (
         SELECT temp.*,
                row_number() OVER (PARTITION BY EMP_ID, BASE_RATE ORDER BY effective_on) AS rn
           FROM temp
        ) temp2
    WHERE rn = 1
  )
WHERE rn2 = 1;