Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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如何返回包含最近日期和最高int值的记录_Sql_Sql Server_Tsql_Select_Top N - Fatal编程技术网

SQL如何返回包含最近日期和最高int值的记录

SQL如何返回包含最近日期和最高int值的记录,sql,sql-server,tsql,select,top-n,Sql,Sql Server,Tsql,Select,Top N,我必须返回SQL数据库中最近的一行,按CallID分组。本例中的“最近”是指最近的离开日期和该日期的最高离开时间(int)。请参见以下示例以供参考: set dateformat dmy create table #Temp ( Callid nvarchar(6), Linenum nVarchar(6), Engineerid nvarchar (4), Departuredate DateTime, Departuretime int ) insert into #Temp Va

我必须返回SQL数据库中最近的一行,按
CallID
分组。本例中的“最近”是指最近的离开日期和该日期的最高离开时间(int)。请参见以下示例以供参考:

set dateformat dmy
create table #Temp
(
Callid nvarchar(6), 
Linenum nVarchar(6), 
Engineerid nvarchar (4), 
Departuredate DateTime, 
Departuretime int
)
insert into #Temp 
Values (
'100000','1','AToo','05/09/2017','57896'),
('100000','1.5','DBok','05/09/2017','57898'),
('100000','1.75','DBok','05/09/2017','57895'),
('100000','2','GKar','04/09/2017','59805'),
('100000','3','ALee','05/09/2017','54895'),
('100001','1','GKar','08/09/2017','54000'),
('100001','2','GKar','08/09/2017','58895'),
('100001','2.25','ALee','08/09/2017','56875'),
('100001','2.5','DBok','07/09/2017','59000')

select * from #Temp
drop table #Temp
我想为上述内容返回以下两条记录:

CallID  Linenum  Engineerid  Departuredate  Departuretime
100000  1.5      DBok        05/09/2017     57898
100001  2        GKar        08/09/2017     58895

您可以使用
row\u number
窗口功能按照
callid
对记录进行排序,然后只需选择第一个:

SELECT CallID, Linenum, Engineerid, Departuredate, Departuretime
FROM   (SELECT CallID, Linenum, Engineerid, Departuredate, Departuretime,
               ROW_NUMBER() OVER (PARTITION BY CallID
                                  ORDER BY Departuredate DESC, Departuretime DESC) AS rn
        FROM   #Temp) t
WHERE  rn = 1

您可以使用带有领带的
TOP 1的技巧

select TOP 1 WITH TIES * 
from #Temp
ORDER BY ROW_NUMBER() OVER (PARTITION BY CallId ORDER BY Departuredate DESC,Departuretime DESC);

ORDER BY ROW_NUMBER()(按CallId分区…
将重新启动每个
CallId
的行编号。因此,有许多行用
1
标记最高值
TOP 1
将只选择结果集的第一行,但使用带TIES的
将返回所有第一行(如果有多行)。

这已被询问并回答了很多次,但您在发布详细信息方面做得很好。如果你在你的帖子中提供这样好的细节和有用的数据,你将继续得到很好的答案。现在,如果你能教其他人提出清晰的问题DSorry Sean在Google中搜索,找到了每个Mureinik的行号引用,但我没有看到在OVER子句中的每个order by列后添加Desc(或Asc)的关键位。成功了!下次我会记住这一点!没什么好道歉的。你在发布问题时做得很好。我期待下一次。布里尔!忘记了订单之后的描述,成功了!