sql-server-2008 - SQL Server 2008 中的 SQL 查询 - 分组和排序

标签 sql-server-2008 sorting grouping

我正在寻找 SQL 查询来解决我遇到的问题。

我有两列 - 第一列是“员工全名”(包含全名),第二列是“工作时间”。

Employee Full Name | Hours | grading
-------------------------------------
john ran             122
john medi            177
john mat             138
jack rom             66
jack ton             88

我想通过以下方式更新“评分”列的数据库:

按员工的名字对他们进行分组,然后按工作时间(具有特定名字的员工的最高工作时间)对他们进行评分(按升序排列),等级为 1,第二个为 2,等等...)。

结果应该是这样的:

Employee Full Name | Hours | grading
------------------------------------
john ran             122      3
john medi            177      1
john mat             138      2
jack rom             66       2
jack ton             88       1

没有 2 名员工具有相同的全名

最佳答案

您可以使用 CTE 使用 row_number() 执行此更新

;with cte as
(
  select *,
    row_number() 
      over(partition by substring([EMPLOYEE FULL NAME], 1, charindex(' ', [EMPLOYEE FULL NAME])) 
           order by hours desc) rn
  from yourtable
)
update cte
set grading = rn;

参见SQL Fiddle with Demo

理想情况下,您需要规范化数据库,将名字和姓氏放在不同的列中。

关于sql-server-2008 - SQL Server 2008 中的 SQL 查询 - 分组和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635684/

相关文章:

sql-server-2008 - CTE 使用 SQL Server 获取两个日期之间的日期

algorithm - 以最小代价划分为n个bins

python - 对串联的 Pandas 数据框进行排序

xslt - sharepoint dataview webpart xslt 按列的左侧字符分组

django - 在 Django 的 manytomany 字段中分组

sql - 使用唯一递增值更新表中的 int 列

sql - 仅选择表中两列的不同值

sql-server - SQL Server 2008 中存储整数值的最小数据类型是什么?

MySQL:如何从一个 GROUP BY 级别中选择一个值并在所有级别中广播