Необходимо выбрать самую последнюю запись, сгруппировать по клиенту и коду товара

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть базовая таблица сведений о заказе, которая содержит: docDate , customerCode , itemCode , Price , и Quantity . Просмотрел ряд похожих вопросов, но, похоже, они не учитывали все, что мне нужно, и мне не удалось перенастроить другие решения.

Конечная цель: только самая последняя запись каждого отдельного товара, когда-либо купленного клиентом. (Таким образом, одна запись на элемент)

Цены и количества меняют запись на запись, и я просто хочу самую последнюю.

Это дает мне самую последнюю запись каждого элемента (код и дату)

 SELECT itemCode, MAX(docDate) AS docDate
FROM RDR1 
WHERE customerCode= 'TEST001' 
GROUP BY ItemCode
  

Теперь мне нужно иметь возможность извлекать другие фрагменты информации из этих самых последних строк, например, цены и количества.

Ответ №1:

Я думаю, вы хотите что-то вроде этого:

    select
    * -- or whatever columns you actually want
    from
    RDR1
    inner join
    (SELECT itemCode, MAX(docDate) AS docDate
    FROM RDR1 
    WHERE customerCode= 'TEST001' 
    GROUP BY ItemCode) MD
    on MD.docDate = RDR1.docDate
and md.ItemCode = RDR1.ItemCode
  

Комментарии:

1. Хорошо, так что это почти все. Также должен быть другой, ГДЕ CustomerCode = ‘TEST001’ вне подзапроса, потому что он собирает заказы от других клиентов, которые также заказали этот продукт в ту же дату. Спасибо

Ответ №2:

 SELECT distinct (ItemCode), docDate, Price, Quantity
FROM RDR1
WHERE customerCode= 'TEST001' 
ORDER BY docDate DESC
  

Комментарии:

1. Это создает запись для каждой отдельной цены и количества. Я ищу самую последнюю запись для каждого кода товара, независимо от количества или цены. Итак, если сегодня по заказу было продано 5 ящиков товара A по цене 10 долларов США / ящик, а вчера по заказу было продано 10 ящиков товара A по цене 15 долларов США / ящик, я бы увидел только одну запись о случае A с количеством 5 и ценой 10 долларов США

2. Нет. OP хочет видеть данные только для самой последней строки для каждого элемента.

Ответ №3:

Использование ROW_NUMBER:

 SELECT *
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY itemCode ORDER BY docDate DESC) AS RowNumber, *
    FROM RDR1
    WHERE customerCode = 'TEST001'
) x
WHERE x.RowNumber = 1
ORDER BY x.itemCode
  

Для просмотра нескольких клиентов добавьте customerCode в раздел:

 SELECT ROW_NUMBER() OVER (PARTITION BY customerCode, itemCode ORDER BY docDate DESC) AS RowNumber, *