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.CustomerID和CustomerInfo.CustomerName.不过,我只想展现独特CustomerID和CustomerName具有只是他们的一个一起CustomerReviews.Reviews和CustomerReviews.Score.我也想订购CustomerReviews.Score.
我无法弄清楚如何做到这一点,因为客户可以留下多个评论,但我只想要一个评分最高的客户列表.
有任何想法吗?
这是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通配符.