2012-06-14 5 views
0

У меня есть две таблицы, а именно: прайс-лист (таблица А) и Order Record (таблица B): -Как выбрать последнюю строку

Таблица A

SKU Offer Date Amt 
AAA 20120115 22 
AAA 20120223 24 
AAA 20120331 25 
AAA 20120520 28 

Таблица B

A001  AAA 20120201 
B001  AAA 20120410 
C001  AAA 20120531 

Мне нужно получить самую последнюю цену для каждого клиента. Ожидаемый результат должен быть следующим: -

Customer SKU Order Date Amt 
A001  AAA 20120201 28 
B001  AAA 20120410 28 
C001  AAA 20120531 28 

Спасибо.

+3

Надлежащий [пример код] (http://sscce.org/) (здесь, заявление SQL) является более полезным, чем любой специальной схема и выборки формат данных или [таблица dump] (http://tkyte.blogspot.com/2005/06/how-to-ask-questions.html). Пожалуйста, используйте 'CREATE TABLE' и' INSERT ... VALUES' для образцов. Желаемые результаты не обязательно должны быть представлены в качестве примера кода, так как результаты - это результат кода, а не самого кода. – outis

+0

Согласитесь с outis - я не понимаю, что вы пытаетесь сделать. – lxop

+1

Возможный дубликат [Как я могу выбрать строки с MAX (значение столбца), DISTINCT другим столбцом в SQL?] (Http://stackoverflow.com/q/612231/), [SQL: выберите самую последнюю дату для каждой категории ] (http://stackoverflow.com/q/6680568/) – outis

ответ

1

Здесь T-SQL - не уверен, что вы используете, добавьте это как тег в свои вопросы для получения более качественных ответов. Написал это до редактирования OP, поэтому дважды проверьте col.

EDITED на комментарий X-нули

SELECT B.CUSTOMER,S.SKU,B.ORDERDATE,S.Amt 
FROM TABLE_B B 
INNER JOIN 
( SELECT C.SKU,C.OFFERDATE,C.Amt, 
    ROW_NUMBER() OVER (PARTITION BY C.SKU ORDER BY C.OFFERDATE DESC) X 
    FROM TABLE_A C 
)S ON S.X = 1 AND B.SKU = S.SKU 
ORDER BY B.CUSTOMER 


CREATE TABLE TABLE_A 
(SKU varchar(8), OfferDate Date, Amt int) 
INSERT INTO TABLE_A 
VALUES('AAA', '2012-01-15', 22), 
     ('AAA' ,'2012-02-23', 24), 
     ('AAA' ,'2012-03-31', 25), 
     ('AAA' ,'2012-05-20', 28), 
     ('BBB','2011-01-15 00:00:00.000', 33), 
     ('BBB','2011-02-23 00:00:00.000', 35), 
     ('BBB','2011-03-31 00:00:00.000', 36), 
     ('BBB','2011-05-20 00:00:00.000', 39), 
     ('CCC', '2012-01-15', 43), 
     ('CCC' ,'2012-02-23', 45), 
     ('CCC' ,'2012-03-31', 47), 
     ('CCC' ,'2012-04-18', 44) 

CREATE TABLE TABLE_B 
(CUSTOMER varchar(8),SKU varchar(8), OrderDate Date) 
INSERT INTO TABLE_B 
VALUES('A001','AAA','2012-02-01'), 
     ('B001','AAA','2012-04-10'), 
     ('C001','AAA','2012-05-31'), 
     ('A001','BBB','2011-02-01'), 
     ('B001','BBB','2011-04-10'), 
     ('C001','BBB','2011-05-31'), 
     ('B001','CCC','2011-04-10'), 
     ('C001','CCC','2011-05-31') 
+0

Он продолжает говорить, что SKU не является таблицей S в * N. Кстати, я использую DB2. – Bob

+0

Не знаю о DB2 - похоже, что он пытается вывести неправильный столбец или имя. Имена столбцов не были включены в B - хотя S - A. Попробуйте разбить его и запустить внутренний запрос, заменив имена столбцов, а затем запустив больше, когда вы его исправите. И еще раз, не знаю, синтаксис DB2 - может потребоваться некоторые настройки - быстрый поиск сказал, что «Ранг над разделом» поддерживается. – user1166147

+0

Извините, это не даст правильных результатов, если разные SKU имеют изменения цен в разные даты (происходит постоянно в розничной среде). Есть ли причина для бит 'SELECT MAX()? Я бы просто использовал ссылку с помощью функции «RANK()». Задание _both_ 'DISTINCT' и' GROUP BY' не имеет значения, и я чувствую, что на самом деле этого не требуется. –

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