一行数据仅适用于最大日期 - 事务SQL

问题描述:

我想选择与其他表的最大日期,只给我一个不同的最大日期行,而不是其他日期的其他行。我最大的代码是一行数据仅适用于最大日期 - 事务SQL

SELECT DISTINCT     
Cust.CustId,      
LastDate=(Select Max(Convert(Date,TreatmentFieldHstry.TreatmentDateTime)) 
      FROM TreatmentFieldHstry 
      WHERE Cust.CustSer = Course.CustSer 
      AND Course.CourseSer = Session.CourseSer 
      AND Session.SessionSer = TreatmentFieldHstry.SessionSer) 

这给多个行取决于多少日期 - 我只想一个最大 - 任何人都可以帮助这个?

感谢

+1

似乎并不完整的SQL。外部SELECT的FROM子句在哪里? – 2011-06-06 16:38:15

+0

只需确认...您只需要基于治疗现场历史表中最近期日期的单个客户ID? – DRapp 2011-06-06 16:39:30

+0

还是你想要每个表的最大日期,所有的值返回单行? – squillman 2011-06-06 16:42:29

没有指定正是你正在使用的数据库和版本 - 但如果你的SQL Server 2005或更新版本,您可以使用类似这样(的CTE与ROW_NUMBER排名功能) - 我已经简化了一下,因为我不知道你选择的其他表格是什么,这些表格从来没有出现在任何SELECT列表中.....

;WITH TopData AS 
(
    SELECT c.CustId, t.TreatmentDateTime, 
     ROW_NUMBER() OVER(PARTITION BY c.CustId ORDER BY t.TreatmentDateTime DESC) AS 'RowNum' 
    FROM 
     dbo.TreatmentFieldHstry t 
    INNER JOIN 
     dbo.Customer c ON c.CustId = t.CustId -- or whatever JOIN condition you have 
    WHERE 
     c.CustSer = Course.CustSer 
) 
SELECT 
    * 
FROM 
    TopData 
WHERE 
    RowNum = 1 

基本上,CTE(公用表表达式)将您的数据按CustId划分,并按TreatmentDateTime排序(降序 - 最新的最前) - 并用连续数字为每个条目编号 - 对于每个“分区”(例如,对于CustId的每个新值)。有了这个,每个客户的最新条目有RowNum = 1这是我用来从该CTE中选择它。