如何返回最近的记录

时间:2015-04-22 12:06:20

标签: sql sql-server select

我有两个表,SalesSalesNotes,如下所示

Sales
SO No......Cust.........Date  
1..........Me..........22-04-13  
2..........You.........23-04-13  



SalesNotes  

SO No.......Note.......Notedate  
1...........Blah.......24-04-13  
2...........Bleh.......23-04-13  
2...........Bluh.......27-04-13  

如何返回显示相应SO号的Cust,日期和最近日期注释的结果集?

我尝试过使用MAX()但不能在where子句中使用聚合,并且不明白如何实现HAVING来做我需要的。

我想要实现的目标是:

SO No.......Cust........Note  
1...........Me..........Blah    
2...........You.........Bluh  

6 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用row_number窗口函数:

SELECT    s.[So no], [cust], [Note]
FROM      [Sales] s
LEFT JOIN (SELECT [So no], [Note],
                  ROW_NUMBER() OVER (PARTITION BY [So no]
                                     ORDER BY [Notedate] DESC) rn
           FROM   [SalesNotes]) n ON s.[So no] = n.[So no] AND rn = 1

答案 1 :(得分:1)

您可以使用outer apply

select s.*, sn.note
from sales s outer apply
     (select top 1 sn.*
      from salesnotes sn
      where sn.so_no = s.so_no
      order by sn.notedate desc
     ) sn;

答案 2 :(得分:1)

您可以使用窗口函数FIRST_VALUE获取每Note的最新[SO No.]值:

SELECT s.[SO No.], Cust, Note
FROM Sales AS s
INNER JOIN (SELECT DISTINCT [SO No.], 
                   FIRST_VALUE(Note) OVER (PARTITION BY [SO No.] 
                                           ORDER BY NoteDate DESC) AS Note
            FROM SalesNotes) AS sn
ON s.[SO No.] = sn.[SO No.]

这样就可以避免使用相关的子查询,我认为这种子查询性能较差。

FIRST_VALUE可从SQL Server 2012+获得。

答案 3 :(得分:0)

我将您的输出理解为上次销售和该销售的最后一个注释。如果您要对所有销售执行此操作,请先删除Top 1。您可以使用Apply执行此操作:

Select Top 1 s.SoNo, s.Cust, oa.Note
From Sales s
Outer Apply (Select Top 1 Note From Notes n Where n.SoNo = s.SoNo Order By Date Desc) oa
Order By s.Date desc

答案 4 :(得分:0)

这样的事情:

select s.so_no, s.cust, 
(select top (1) n.note from salesnotes n where s.so_no = n.so_no order by notedate desc) as note
from sales s

答案 5 :(得分:0)

因为你在谈论' max'在where子句中,这只是为了让你理解' max' 。而且你知道这不是一个好的解决方案,因为有很多问题,例如,如果两个不同的客户的注释是相同的,如果客户具有相同的名称,等等等等。您应该遵循外部应用概念,正如其他人为正确的解决方案所建议的那样。

Select s.SoNo, s.cust, sn.notes,           max(sn.noteDate) from sales s inner join salesnotes sn on s.sono=sn.sono group by s.sono,s.cust,sn.notes