简单表:
create table [dbo].[payraisehistory]
(
[id][int] not null,
[payrate][money] not null,
[empid][int] not null
)
//查询以返回上次支付加薪
select prh.empid, max(prh.dategrant)
from payraisehistory prh
group by prh.empid
empid (No column name)
2 2013-07-30 00:00:00.000
3 2013-07-30 00:00:00.000
我如何获得回报......当我添加支付率时,我会收回所有行而不是最新的工资率(每次最高(dategrant)。
我想在不使用嵌套查询的情况下执行此操作。我在小组中错过了什么?
select prh.empid, prh.payrate, max(prh.dategrant)
from payraisehistory prh
group by prh.empid, payrate
empid payrate (No column name)
2 20.00 2013-04-30 00:00:00.000
2 30.00 2013-05-30 00:00:00.000
2 40.00 2013-06-30 00:00:00.000
2 50.00 2013-07-30 00:00:00.000
3 100.00 2013-04-30 00:00:00.000
3 120.00 2013-07-30 00:00:00.000
答案 0 :(得分:2)
这是您要使用row_number()
:
select prh.empid, prh.payrate, prh.dategrant
from (select prh.*,
row_number() over (partition by prh.empid order by prh.dategrant desc) as seqnum
from payraisehistory prh
) prh
where seqnum = 1;
您的查询是:
select prh.empid, prh.payrate, max(prh.dategrant)
from payraisehistory prh
group by prh.empid, payrate;
这是按empid
和 payrate
汇总的。这些似乎唯一地定义了表中的行,因此您将获得所有这些行。我想可以重复付费,但你的数据没有这样的实例。
答案 1 :(得分:1)
SELECT * FROM
(
select prh.empid, prh.payrate, CASE WHEN prh.dategrant = max(prh.dategrant) over(partition
by prh.empid ORDER BY byprh.empid) THEN 1 ELSE 0 END AS st from payraisehistory prh
) AS T WHERE t.st = 1
答案 2 :(得分:1)
运行最高(payrate)可能会从max(dategrant)的不同记录中获得工资率。您需要获取最后日期的记录ID,并从子查询中的该记录中提取payrate。
答案 3 :(得分:0)
您可以使用子查询中的MAX
聚合将表连接到自身:
select p.empid, p.payrate, p.dategrant
from payraisehistory p
join (
select prh.empid, max(prh.dategrant) maxdategrant
from payraisehistory prh
group by prh.empid
) p2 on p.empid = p2.empid and p.dategrant = p2.maxdategrant