您需要将数据划分到每个帐户的行组中。然后,您可以使用此分组数据检索每个组中的前n个数据。这意味着你不必在每个选择中指定帐户ID。
下面是使用临时表来保存一些示例数据一个例子:
CREATE TABLE [#bank]
(
bnk_id INT IDENTITY(1, 1) PRIMARY KEY NOT NULL,
bnk_acc_id INT NOT NULL,
bnk_date datetime NOT NULL
)
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES (1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(1, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(2, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
INSERT INTO [#bank] (bnk_acc_id, bnk_date) VALUES(3, getutcdate())
GO
WITH [Grouped] AS (
SELECT bnk_id
, bnk_acc_id
, bnk_date
, ROW_NUMBER()
OVER (
PARTITION BY [bnk_acc_id]
ORDER BY [bnk_date] DESC
) [RowInGroup]
FROM [#bank]
)
SELECT * FROM [Grouped]
WHERE [RowInGroup] <= 5
DROP TABLE [#bank]
主要部分是
WITH [Grouped] AS (
SELECT bnk_id
, bnk_acc_id
, bnk_date
, ROW_NUMBER()
OVER (
PARTITION BY [bnk_acc_id]
ORDER BY [bnk_date] DESC
) [RowInGroup]
FROM [#bank]
)
SELECT * FROM [Grouped]
WHERE [RowInGroup] <= 5
这将创建GROUPE数据,然后相应地过滤。
更多的Infor对分区在MSDN:
http://technet.microsoft.com/en-us/library/ms186734.aspx
对未来的答案:如果问题用'sql'标记,则答案应该是* standard * SQL。标签'sql'是指*查询语言*而不是特定的DBMS产品(而不是SQL Server)。 (我指的是使用'[..]引用标识符的非标准方式 - 公共表表达式和窗口函数**是**标准SQL) –