我有以下表结构..
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_rate
是2015-11-12
是相同的,因此之前有效{{1}}
我试过......一切......无法找到确切的查询..
答案 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;