5

我有一个AccountAction非规范化的 SQL Server 表。它是AccountandAction表的扁平化版本,我希望它可以更快地报告数百万行的查询。一个Account可以有很多Actions,所以表格看起来类似于:

Account     Action
account1    action1
account1    action2
account1    action10
account2    action5

但是,我在获取简单存储过程中受限子集的信息时遇到了一些麻烦。

select Account, Action
from AccountAction
where ???

我正在寻找的是获得前 X 个帐户及其所有操作。所以这将是一个动态的行数。因此,如果我传入 1,使用上面的示例表,我会得到 3 行(即给我第一个帐户的所有行)。

(我不介意帐户名称会出现在每一行中 - 它会在其他地方进行旋转)

我是否需要使用 ROWNUM 或类似来限制行?我确信这一定是一个比我迄今为止发现的更简单的问题。

编辑

使用 TOP 的答案不起作用,在示例中,如果我说“给我一个(第一个)帐户”,我希望返回 3 行。但是我怎么知道会有 3 个呢?它的动态。此外,它们可能不是连续的,如果 account1 的 action99 在结果中的位置为 5500 万怎么办。

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字段进行过滤AccountAction;这通常是在数据库级别连接关系的表中的情况M:N

于 2012-04-30T11:58:12.523 回答
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 回答
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 回答