5

AccountAction非正規化された SQL Server テーブルがあります。Accountこれはテーブルとテーブルのフラット化されたバージョンであり、Action何百万行にも及ぶクエリをレポートするために、はるかに高速になることを願っています。Account多くの を使用できるためActions、表は次のようになります。

Account     Action
account1    action1
account1    action2
account1    action10
account2    action5

ただし、単純なストアド プロシージャで制限されたサブセットの情報を取得するのに問題があります。

select Account, Action
from AccountAction
where ???

私が探しているのは、すべてのアクションを含む最初の X アカウントを取得することです。したがって、これは動的な行数になります。したがって、上記の例のテーブルを使用して 1 を渡すと、3 つの行が得られます (つまり、最初のアカウントのすべての行が得られます)。

(アカウント名が各行にあることは気にしません - 別の場所にピボットされます)

行を制限するために ROWNUM などを使用する必要がありますか? これは、これまでに見つけたよりも単純な問題に違いないと確信しています。

編集

TOP を使用した回答は機能しません。この例では、「(最初の) アカウントを 1 つください」と言った場合に 3 行が返されるようにします。しかし、どうすれば 3 つあるとわかるでしょうか。そのダイナミック。また、account1 の action99 が結果の 5,500 万の位置にあったとしたら、それらは連続していない可能性があります。

4

5 に答える 5

4
WITH
  SequencedData
AS
(
  SELECT
    DENSE_RANK() OVER (ORDER BY Account) AS account_sequence_id,
    *
  FROM
    AccountAction
)
SELECT
  *
FROM
  SequenceData
WHERE
  account_sequence_id = ???

または、複数の場合...

WHERE
  account_sequence_id BETWEEN 3 AND 5    -- For the 3rd, 4th and 5th accounts.
于 2012-04-30T11:56:40.747 に答える
1
SELECT *
FROM AccountAction
WHERE account IN  (SELECT account
    FROM AccountAction
    GROUP BY account HAVING account BETWEEN *start-account* AND *end-account*
    ORDER BY account
)

説明:サブクエリは個別のアカウントでグループ化され(単純なものよりもきめ細かい選択基準が可能にDISTINCTなります)、それらのアカウントのみを返します。外側のSELECTは、サブクエリによってフェッチされた個別のアカウントに応じて、可変数の行を取得します。

編集:上記は、テーブルのaccountフィールドでフィルタリングできることを前提としています。これは通常、 DBレベルで関係を結合するAccountActionテーブルの場合です。M:N

于 2012-04-30T11:58:12.523 に答える
0

キーワード(および個別)を使用した単純なサブ選択によりtop、最初のXアカウントのすべてのアクションが得られます

select * from AccountAction
where Account in 
(select distinct top (@NumberOfAccounts) Account 
from AccountAction order by Account)
于 2012-04-30T12:04:21.480 に答える
0

質問が正しければ、最初の10行を選択したい場合は、次を使用します

SELECT TOP 10 Account, Action
FROM AccountAction

または、最初の 20 パーセントのレコードが必要な場合は、次を使用します。

SELECT TOP 10 PERCENT Account, Action
FROM AccountAction
于 2012-04-30T11:56:35.907 に答える
0

TOPは試しましたか?

 declare @hoW_many int
 set @hoW_many = 10

 select top (@hoW_many)  * 
 from AccountAction
于 2012-04-30T11:57:11.303 に答える