2015-04-22 6 views
1

я две таблицы, Sales и SalesNotes, как показано нижеКак вернуть последнюю запись

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 

Как я могу вернуть результирующий набор, показывающий Cust, дату и самую последнюю датированную записку соответствующего SO нет?

Я пробовал использовать MAX(), но не могу использовать агрегат в предложении where и не понимаю, как я мог бы реализовать HAVING, чтобы делать то, что мне нужно.

То, что я пытаюсь достичь:

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

Какую версию SQL Server вы используете, и почему не «SO №» 1 не входит в нужный набор результатов? –

+0

Я использую MSSQL 2012 и SO no 1 пропущен по ошибке ... –

+0

ваш текст заявляет, что вы хотите самого последнего, ваш сделанный результат показывает, что вы хотите самого старого. Что он ? –

ответ

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

Один из способов сделать это с помощью функции 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 
+0

Спасибо, это сработало. –

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 
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 
0

Так ты говорил о «Макс» в том, где , это просто для вас, чтобы понять «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 
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+.

Смежные вопросы