#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, *