0

ほとんどの書籍を購入した Web サイトの最も人気のあるユーザーを取得するためのクエリを作成しています。数は、上位 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 に答える