【问题标题】:Getting average salary of last 3 salaries获取最近3个薪水的平均薪水
【发布时间】:2015-07-27 18:36:46
【问题描述】:
+------------+--------+-----------+---------------+
|  paydate   | salary | ninumber  | payrollnumber |
+------------+--------+-----------+---------------+
| 2015-05-15 |   1000 | jh330954b |             6 |
| 2015-04-15 |   1250 | jh330954b |             5 |
| 2015-03-15 |    800 | jh330954b |             4 |
| 2015-02-15 |    894 | jh330954b |             3 |
| 2015-05-15 |    500 | ew56780e  |             6 |
| 2015-04-15 |   1500 | ew56780e  |             5 |
| 2015-03-15 |   2500 | ew56780e  |             4 |
| 2015-02-15 |   3000 | ew56780e  |             3 |
| 2015-05-15 |    400 | rt321298z |             6 |
| 2015-04-15 |    582 | rt321298z |             5 |
| 2015-03-15 |    123 | rt321298z |             4 |
| 2015-02-15 |    659 | rt321298z |             3 |
+------------+--------+-----------+---------------+

上面的列表是我数据库中的数据。我需要获取每个人前 3 次薪水的平均值并将其输出。

我不知道从哪里开始,所以到目前为止我无法提供我的任何工作。

【问题讨论】:

  • 欢迎来到stackoverflow。请阅读How to Ask
  • 使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql sql-server tsql


【解决方案1】:

在 SQL Server 中,您可以使用row_number() 来获取子查询中的最后三个薪水。然后使用avg():

select ninumber, avg(salary)
from (select t.*,
             row_number() over (partition by ninumber order by payrollnumber desc) as seqnum
      from table t
     ) t
where seqnum <= 3
group by ninumber;

【讨论】:

  • 这很好,因为每个实体只有 4 行数据。如果一个实体有 6 行数据会怎样?
  • @StarPilot 无论每个实体有多少记录,都会发生同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
  • 2022-01-07
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多