如何从最大(日期时间)汇总中获得薪水?

时间:2013-07-31 02:27:11

标签: sql sql-server-2008

简单表:

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

4 个答案:

答案 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