2

約35,000 行の販売スナップショットがあります。列を呼び出しましょう:

Sales Rep | Account ID | Total Contract Value | Date

すべてをグループ化する必要がSales Repあり、そこから、2013 年 1 月 (日付) の $10,000 以上であることに基づいて上位 35Sales Repのアカウントを選択します。Total Contract ValueTotal Contract Value

たとえば、John Doe が 1 月からこのテーブルに 294 個のアカウントを持っていたとします。私は彼の上位 35 個のアカウント >= $10,000 のみを表示したいと考えています。Jane Doe についても同様です。クエリがそのリソースで効率的であることは非常に重要です。可能な限り使用。

考え?

4

2 に答える 2

2

答えはすでにあなたのタイトルにあり、 と で分割しSalesRepAccountIDでランク付けしTotal Contact Valueます。

ソリューションは次のSQL Serverようになります。

DECLARE @minimumValue decimal(20,2) = 10000
DECLARE @numberOfAccounts int = 35
DECLARE @from datetime = '1/1/2013'
DECLARE @till datetime = DATEADD(MONTH, 1, @from)

SELECT 
  [sub].[Sales Rep],
  [sub].[Rank],
  [sub].[Account ID],
  [sub].[Total Contract Value]
FROM
(
  SELECT
    [Sales Rep],
    [Account ID],
    [Total Contract Value],
    DENSE_RANK() OVER (PARTITION BY [Sales Rep] ORDER BY [Total Contract Value] DESC) AS [Rank]
  FROM [Sales]
  WHERE
    [Total Contract Value] >= @minimumValue
    AND [Date] > @from
    AND [Date] < @till
) AS [sub]
WHERE [sub].[Rank] <= @numberOfAccounts
ORDER BY 
  [Sales Rep] ASC,
  [Rank] ASC

これは(単純な)Sql Fiddleです。

于 2013-02-01T21:00:35.653 に答える
0

このために、次の関数を使用しますrow_number()

select ss.*
from (select ss.*, row_number() over (partition by salesrep order by ContractValue desc) as seqnum
      from snapshot ss
      where TotalContractValue >= 10000 and date between '2013-01-01' and '2013-01-31'
     ) ss
where seqnum <= 35

使用しているデータベースを指定しません。を持たないデータベースではrow_number()、効率の悪い代替手段があります。

于 2013-02-01T21:16:36.310 に答える