Задать вопрос
@notmvp

Как составить запрос на последнего юзера, купившего товар?

Есть три связанные таблицы магазина: пользователи, товары, покупки.
Джойним их и получаем одну общую таблицу, в которой отражены все покупки каждого из товаров.
Среди прочего там есть столбцы userID, productID, date, ...
Разные юзеры покупают разные товары в разное время.
Как получить таблицу, которая хранит в себе последнюю покупку каждого из товаров (получить ID товара и ID пользователя, который совершил эту последнюю покупку). В общем виде хочу знать, кто последний купил тот или иной товар?
Что делаю я:
SELECT userID, productID, MAX(date) FROM table
GROUP BY productID

Ожидаю получить таблицу, в которой будет каждая строка соответствовать одному продукту и в ней будет дата последней покупки, и соответственно, продукт и юзер.
Получаю в принципе такую таблицу, но:
Дата в поле MAX(date) является действительно самой большой датой в конкретной группе и productID тоже нормальный, а вот userID берётся другой, не связанный со строкой, содержащей эту максимальную дату. Соответственно, я получаю не последнего юзера, который купил этот товар, а просто одного из юзеров, который когда-либо покупал этот товар (на деле данные в userID берутся просто из первой строки текущей группы). Т.е. таблица получается не связанная и не решающая задачу.
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Такой запрос делается через оконные функции
SELECT `userID`, `productID`, `date`
  FROM (
    SELECT `userID`, `productID`, `date`,
           ROW_NUMBER() OVER `win` AS `row`
      FROM `table`
      WINDOW `win` AS (PARTITION BY `productID` ORDER BY `date` DESC)
  ) AS `t`
  WHERE `row` = 1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GigaLORDex
@GigaLORDex
Бизнес-Системный аналитик
А если так?

SELECT
	Cust.Cust_User,
	Usr.User_Name,
	Cust.Cust_Prod_ID,
	Prod.Prod_Name,
	Cust.Cust_DateTime_Buy
FROM
	Customer as Cust
LEFT JOIN Customer Cust2 ON
	Cust.Cust_User = Cust2.Cust_User
	AND Cust.Cust_Prod_ID = Cust2.Cust_Prod_ID
	AND Cust.Cust_DateTime_Buy < Cust2.Cust_DateTime_Buy
LEFT JOIN Users as Usr ON
	Cust.Cust_User = Usr.User_ID
LEFT JOIN Product as Prod ON
	Cust.Cust_Prod_ID = Prod.Prod_ID
WHERE
	Cust2.Cust_ID IS NULL;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы