我在sql server 2014中有一个下表
Empno Resign Hour Dept
1000 2999-01-01 40 20
1000 2999-01-01 40 21
1001 2999-01-01 40 22
1001 2999-01-01 40 23
我需要根据辞职日期和小时选择最高记录。部门与哪个部门相关并不重要。所以我去了查询
SELECT *
FROM(
SELECT Empno,Resign, Hour, Dept,
ROW_NUMBER() OVER(PARTITION BY Empno ORDER BY Resign DESC,
hour DESC) AS Row
FROM Table ) AS master
WHERE master.Row = 1
AND master.Empno = '1000';
我回来了
EmployeeNumber ResignationDate Hour Dept Row
1000 2999-01-01 40 20 1
我理解sql server不保证行号的顺序(在本例中是dept的行),除非为Dept指定了order by子句。
我不介意哪个行会被哪个部门选中,但是这会根据一些索引或ID一致地选择一个,查询计划将如何生成顶部?
在row_number中我可以简单地添加另一个基于dept的orderby,这样它就可以一直拿起一个但我不想这样做。
答案 0 :(得分:0)
否。您必须使用唯一组合添加order by
以强制执行非任意输出。
为什么?它的简单问题 - sql server不会将表视为人类。他阅读并找到不可能不在附近或连续的页面。