如何选择带有TOP 1信息的DISTINCT信息和来自前1个信息的订单

Eri*_*lor 5 sql-server select distinct greatest-n-per-group

我有2个表,看起来像:

CustomerInfo(CustomterID, CustomerName)
CustomerReviews(ReviewID, CustomerID, Review, Score)
Run Code Online (Sandbox Code Playgroud)

我想搜索一个字符串的评论并返回CustomerInfo.CustomerIDCustomerInfo.CustomerName.不过,我只想展现独特CustomerIDCustomerName具有只是他们的一个一起CustomerReviews.ReviewsCustomerReviews.Score.我也想订购CustomerReviews.Score.

我无法弄清楚如何做到这一点,因为客户可以留下多个评论,但我只想要一个评分最高的客户列表.

有任何想法吗?

Bil*_*win 5

这是Stack Overflow上出现了数十次最大的每组问题.

这是一个与窗口函数一起使用的解决方案:

WITH CustomerCTE (
  SELECT i.*, r.*, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY Score DESC) AS RN
  FROM CustomerInfo i
  INNER JOIN CustomerReviews r ON i.CustomerID = r.CustomerID 
  WHERE CONTAINS(r.Review, '"search"')
)
SELECT * FROM CustomerCTE WHERE RN = 1
ORDER BY Score;
Run Code Online (Sandbox Code Playgroud)

这里的解决方案更广泛地适用于不支持窗口功能的RDBMS品牌:

SELECT i.*, r1.*
FROM CustomerInfo i
INNER JOIN CustomerReviews r1 ON i.CustomerID = r1.CustomerID 
  AND CONTAINS(r1.Review, '"search"')
LEFT OUTER JOIN CustomerReviews r2 ON i.CustomerID = r2.CustomerID 
  AND CONTAINS(r1.Review, '"search"')
  AND (r1.Score < r2.Score OR r1.Score = r2.Score AND r1.ReviewID < r2.ReviewID)
WHERE r2.CustomerID IS NULL
ORDER BY Score;
Run Code Online (Sandbox Code Playgroud)

我正在显示该CONTAINS()函数,因为您应该在SQL Server中使用全文搜索工具,而不是使用LIKE通配符.