0

简单表:

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

我怎样才能得到回报......

我想在不使用嵌套查询的情况下做到这一点。我在 group by 中缺少什么?

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

4 回答 4

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。这些似乎唯一地定义了表中的行,因此您可以将它们全部取回。我想可以重复支付率,但您的数据没有这样的实例。

于 2013-07-31T02:31:43.090 回答
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
于 2013-07-31T02:30:37.250 回答
1

运行 max(payrate) 可能会为您提供与 max(dategrant) 不同的记录的工资率。您将需要获取最后日期的记录 ID,并从子查询中的该记录中提取工资率。

于 2013-07-31T02:30:43.647 回答
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
于 2013-07-31T02:29:49.407 回答