우리는 매일 다양한 상품이 포함 된 다양한 상품을 보유하고 있습니다.고객에게 제품을 문의 하시겠습니까?
고객은 이메일 알림을 신청할 수 있습니다. 이들은 매일 저녁 대량 발송되며 고객은 원하는 제품과 일치하는 주문 목록을받습니다.
- 계정 (pk_AccountID, EmailAddress를, 제목, 이름)
- Accounts_Alerts (fk_AccountID, pk_AlertID, 종류, 최대 가격, 컬러)
- 제품 (pk_ItemID :
데이터베이스에있는 세 개의 관련 테이블이 있습니다 , 카테고리, 제목, 가격, 색상, 날짜 변경)
지난 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
'top 10 '을 사용하여 10 개의 행을 얻을 수 있습니다. –
사용자 당 상위 10 개 제품이 필요한 경우 쿼리에 row_number() 또는 rank()를 추가하고 사용자별로 분할하고 <= 10으로 제한 할 수 있습니다. SQL을 다른 select 내에서 래핑해야합니다. –
윈도우 화 된 함수 [행 번호] (https://msdn.microsoft.com/en-us/library/ms186734.aspx?f=255&MSPPError=-2147217396)는이 작업에 적합합니다. by by partition을 사용하여 고객 당 10 개의 행을 반환합니다. [MCVE]를 추가하면 (http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-bea-a- very-simple-sql-query) 누군가가 당신의 쿼리를 재 작성하는 것을 도와 줄 것이라고 확신한다. –