SQL-запрос для самой популярной комбинации - PullRequest
3 голосов
/ 15 февраля 2011

Предположим, у меня есть приложение в продуктовом магазине с таблицей покупок:

customerId int
itemId int

В магазин приходят четыре клиента:

Bob buys a banana, lemonade, and a cookie 
Kevin buys a banana, lemonade, and a donut
Sam buys a banana, orange juice, and a cupcake 
Susie buys a banana

Я пытаюсь написать запрос, который быверните, какие комбинации предметов наиболее популярны.В этом случае, результаты этого запроса должны быть:

banana and lemonade-2

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

banana - 3
lemonade - 2
cookie - 1
donut - 1
cupcake - 1
orange juice - 1

Вот запрос:

SELECT itemId, count( * ) 
FROM grocery_store
INNER JOIN (
SELECT customerId
FROM grocery_store
GROUP BY customerId
HAVING count( itemId ) > 1
)subQuery ON subQuery.customerId = grocery_store.customerId
GROUP BY itemId;

Могу ли я получить указатель о том, как расширить существующий запрос, чтобы получить желаемый результат?

1 Ответ

6 голосов
/ 15 февраля 2011
select a.itemID, b.itemID, COUNT(*) countForCombination
from grocery_store a
inner join grocery_store b
on a.customer_id = b.customer_id
and a.itemID < b.itemID
group by a.itemID, b.itemID
order by countForCombination desc

Предполагается:

grocery_store = записи о продажах
customer_id = уникальная продажа

  • Этот запрос принимает всезаписи grocery_store и для каждой отдельной транзакции продажи создает все возможные комбинации (a.itemid, b.itemid) в определенном порядке (a.itemid
  • . Этот конкретный заказ исключает дубликаты (apple, orange) сохраняется, тогда как (апельсин, яблоко) не требуется.
  • После получения всех комбинаций из всех продаж простая группа по группам и сортировка по количеству используются для отображения наиболее популярных комбинаций сверху
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...