0

我正在编写一个查询来检索我网站上购买最多书籍的最受欢迎用户。该数字应该是动态的,例如前 100 名、前 50 名或前 10 名用户。我为此目的写了下面的查询,但发现了一个问题:

DECLARE @TOPNumber INT
SET @TOPNumber = 10
SELECT 
    S.UserName,
    S.Email,
    TOPST.NumberOfPurchase
    FROM 
    Subscriber S
    JOIN 
    (
        SELECT ROW_NUMBER() Over(order by [FK_Subscriber])as Slno, FK_Subscriber,COUNT(*)     NumberOfPurchase FROM SubscriberPurchase
        GROUP BY FK_Subscriber
        --ORDER BY FK_Subscriber
    ) TOPST ON S.PK_SubscriberID = TOPST.FK_Subscriber AND TOPST.Slno <= @TOPNumber

ORDER BY TOPST.NumberOfPurchase DESC

如您所见,内部查询中的 ORDER BY 子句已被注释,因为我不能在那个地方使用它。如果可以,那么查询会给我想要的结果。

任何人都可以帮助如何做到这一点。我在数据库中有数百万条记录,因此需要适当的优化

4

1 回答 1

1

试试这个:

WITH CTE
AS
(
    SELECT 
      S.UserName,
      S.Email,
      p.NumberOfPurchase,
      ROW_NUMBER() Over(PARTITION BY FK_Subscriber
                        ORDER BY [FK_Subscriber])as Slno, 
    FROM Subscriber S
    INNER JOIN
    (
       SELECT FK_Subscriber, COUNT(*) NumberOfPurchase
       FROM SubscriberPurchase 
       GROUP BY FK_Subscriber
    ) AS p ON S.PK_SubscriberID = p.FK_Subscriber
)
SELECT
  UserName,
  Email,
  NumberOfPurchase
FROM CTE
WHERE Slno  <= @TOPNumber
ORDER BY NumberOfPurchase DESC
于 2013-09-10T09:17:59.320 回答