Найти значение одного поля, которое соответствует максимальному значению данных в другом поле - PullRequest
3 голосов
/ 22 января 2011

Я пытаюсь написать запрос, который получает значение одного поля, связанного с максимальным значением другого поля (или полей).Допустим, у меня есть следующая таблица данных:

OrderID CustomerID  OrderDate   LocationID          
1       4           1/1/2001    1001
2       4           1/2/2001    1003
3       4           1/3/2001    1001
4       5           1/4/2001    1001
5       5           1/5/2001    1001
6       5           1/6/2001    1003
7       5           1/7/2001    1002
8       5           1/8/2001    1003
9       5           1/8/2001    1002

Группируя по CustomerID, я хочу получить максимум OrderDate, а затем LocationID, связанный с любым максимальным OrderDate.Если существует несколько записей, которые имеют максимальную дату заказа, то из числа этих записей с максимальной датой берется LocationID, связанный с максимальным OrderID.

Окончательный набор данных должен выглядеть следующим образом:

CustomerID  OrderDate   LocationID      
4           1/3/2001    1001
5           1/8/2001    1002

Я пытался написать запрос с множеством вложенных подзапросов и уродливых объединений, но на самом деле я ничего не получил.Какой SQL мне нужно написать, чтобы помочь мне получить этот результат.

Ответы [ 3 ]

5 голосов
/ 22 января 2011
with cte As
(
select *, 
        row_number() over (partition by CustomerID 
                           order by OrderDate desc, OrderId desc) as rn
from yourtable
)
select CustomerID, OrderDate,LocationID
from cte 
where rn=1;
3 голосов
/ 22 января 2011
SELECT
   C.Name,
   C.CustomerID,
   X.*
FROM
   Customers C
   CROSS APPLY (
      SELECT TOP 1 OrderDate, LocationID
      FROM Orders O
      WHERE C.CustomerID = O.CustomerID
      ORDER BY OrderDate Desc, OrderID Desc
   ) X

Если вы извлечете какие-либо столбцы из таблицы Customers, это, вероятно, превзойдет другие методы .

Если нет, то ответ Row_Number, извлекаемый только из заказов, вероятно, будет лучшим. Но если вы каким-либо образом ограничите Клиента, то CROSS APPLY снова будет лучшим. Возможно, с большим отрывом.

0 голосов
/ 22 января 2011

Хитрость заключается в том, чтобы использовать подзапрос как значение, а не как объединение:

select customerId,orderDate,locationId
  from orders o1
 where orderDate = (
           select top 1 orderdate
             from orders o2
            where o1.customerId = o2.customerId
            order by orderdate desc
       )
...