【问题标题】:SQL How to return the record with the most recent date and also highest int valueSQL如何返回具有最近日期和最高int值的记录
【发布时间】:2019-02-14 23:23:44
【问题描述】:

我必须返回 SQL 数据库中按CallID 分组的最新行。在这种情况下,“最近”是指该日期最近的 DepartureDate 和最高的 Departuretime (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

【问题讨论】:

  • 这已被多次询问和回答,但您在发布详细信息方面做得很好。如果您在帖子中提供如此详细的信息和有用的数据,您将继续得到很好的答案。现在,如果您可以教其他人发布清晰的问题。 :D
  • 抱歉,Sean,在 Google 中搜索并找到了对每个 Mureinik 的 Row_Number 的引用,但我没有看到在 OVER 子句中的每个 order by 之后添加 Desc(或 Asc)的关键位。那成功了!下次会记住这一点!
  • 没有什么可道歉的。你在发布你的问题时做得很好。期待下一个。

标签: sql sql-server tsql select top-n


【解决方案1】:

你可以使用TOP 1 WITH TIES的技巧

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() OVER(PARTITION BY CallId...) 将为每个CallId 重新开始行编号。所以有很多行带有1 标记最高TOP 1 将只选择结果集的第一行,但使用 WITH TIES 它将返回所有 first 行(如果有多个)。

【讨论】:

    【解决方案2】:

    您可以使用row_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
    

    【讨论】:

    • 太棒了!订购后忘记了 Desc,这成功了!
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多