У нас есть широкий ассортимент продукции, с добавлением многих из них каждый день.Запрос для соответствия товарам клиентам?
Клиенты могут подписаться на оповещение по электронной почте. Они отправляются навалом каждый вечер, и клиенты получают список продуктов, которые соответствуют тому, что они ищут.
Есть три соответствующие таблицы в базе данных:
- Accounts (pk_AccountID, EmailAddress, название, имя)
- Accounts_Alerts (fk_AccountID, pk_AlertID, категория, MaxPrice, цвет)
- Продукты (pk_ItemID , Категория, Название, Цена, Цвет, Дата)
Что является наиболее эффективным способом выбора последних 10 продуктов, добавленных за последние 24 часа, которые соответствуют параметрам каждый клиент выбрал?
Это то, что у меня есть до сих пор, которое работает, но оно не отображает только 10 лучших продуктов по дате (т. Е. Последнее добавленное). Мы не хотим отправлять клиентам более 30 продуктов, чтобы просмотреть их по электронной почте.
SELECT
a.pk_AccountID,
aa.pk_AlertID,
a.Title As Title,
a.Name As Name,
a.EmailAddress As EmailAddress,
p.pk_ItemID As ItemID,
p.Category As Category,
p.Title As Title,
p.Price As Price,
p.Colour As Colour
FROM dbo.Accounts_Alerts aa
INNER JOIN dbo.Accounts a ON aa.fk_AccountID=a.pk_AccountID
LEFT OUTER JOIN dbo.Products p ON
(aa.Category = p.Category OR aa.Category IS NULL)
AND (aa.Colour = p.Colour OR aa.Colour IS NULL)
AND (aa.MaxPrice >= p.Price OR aa.MaxPrice IS NULL)
AND getdate()-1 < p.DateModified
WHERE
a.EmailAddress is not null AND
a.pk_AccountID = @AccountIDVariable
ORDER BY aa.pk_AlertID
Вы можете использовать 'top 10', чтобы получить 10 строк. –
Если вам нужны лучшие 10 продуктов на пользователя, вы можете добавить row_number() или rank() в свой запрос, разделить по пользователю и ограничить его <= 10. Вам нужно будет обернуть ваш SQL внутри другого выбора для этого. –
Для этого отлично подходит оконная функция [номер строки] (https://msdn.microsoft.com/en-us/library/ms186734.aspx?f=255&MSPPError=-2147217396). Используйте раздел by, чтобы вернуть 10 строк на каждого клиента. Если вы добавите [MCVE] (http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a- very-simple-sql-query) Я уверен, что кто-то поможет вам переписать ваш запрос. –