我们有各种各样的产品,每天都有很多产品。
客户可以注册电子邮件提醒。这些产品每晚都会大量发送,客户会收到符合他们所需产品的定制产品清单。
数据库中有三个相关表:
选择在过去24小时内添加的最新10种产品的最有效方法是什么?这些产品与每位客户选择的选项相匹配?
这是我到目前为止所做的,但是它并没有按日期选择前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
答案 0 :(得分:2)
处理此问题的一种常见方法是使用窗口函数和内联视图,SQL Server可以很好地处理它。
例如:
SELECT
pk_AccountID,
pk_AlertID,
Title,
Name,
EmailAddress,
ItemID,
Category,
Title,
Price,
Colour
FROM (
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,
ROW_NUMBER() over (
partition by a.pk_AccountID, p.pk_ItemID
order by p.DateModified desc
) as rseq
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
) as any_alias_will_do
where rseq <= 10
ORDER BY pk_AlertID
注意ROW_NUMBER()
功能 - 你需要确保你正在“按分区”和“按”排序正确的标准(我在这里选择了帐户ID和项目ID,但你可能需要不同的字段) 。尝试单独运行内部查询,以帮助您了解其工作原理。
这种技术非常通用 - 建议您进一步阅读这些功能。