Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用max(datetime)aggreate从中取回工资?_Sql_Sql Server 2008 - Fatal编程技术网

Sql 如何使用max(datetime)aggreate从中取回工资?

Sql 如何使用max(datetime)aggreate从中取回工资?,sql,sql-server-2008,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

简单表格:

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)

我希望在不使用嵌套查询的情况下执行此操作。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

您可以使用子查询中的
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

您可以使用子查询中的
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

运行max(payrate)可能会从不同于max(dategrant)的记录中获得支付率。您需要获取上一个日期的记录id,并在子查询中从该记录中提取支付率。

运行max(payrate)可能会从不同于max(dategrant)的记录中获得支付率。您需要获取上一个日期的记录id,并在子查询中从该记录中提取工资率。

在这种情况下,您需要使用
行编号()

您的查询是:

select prh.empid, prh.payrate, max(prh.dategrant)
from payraisehistory prh
group by prh.empid, payrate;

这是通过
empid
payrate
进行聚合。它们似乎唯一地定义了表中的行,因此您可以将所有行都取回。我认为payrate可以重复,但您的数据没有这样的实例。

这是您希望使用
row_number()
的情况:

您的查询是:

select prh.empid, prh.payrate, max(prh.dategrant)
from payraisehistory prh
group by prh.empid, payrate;

这是通过
empid
payrate
聚合的。它们似乎唯一地定义了表中的行,因此您可以将所有行都取回。我想可以重复一个payrate,但您的数据没有这样的实例。

双扫描表!SQL SERVER 2005中出现了OVER子句机会。@realmumber3012--完全正确同意--使用
排名函数
将是此RDBMS的更好解决方案。双扫描表!SQL SERVER 2005中出现了OVER子句机会。@realnumber3012--完全同意--使用
排名函数
将是此RDBMS的更好解决方案。