Tsql 有没有办法找到包含分组数据的前X条记录?

Tsql 有没有办法找到包含分组数据的前X条记录?,tsql,sybase,greatest-n-per-group,Tsql,Sybase,Greatest N Per Group,我使用的是Sybase 12.5服务器,我有一个定义如下的表: CREATE TABLE SomeTable( [GroupID] [int] NOT NULL, [DateStamp] [datetime] NOT NULL, [SomeName] varchar(100), PRIMARY KEY CLUSTERED (GroupID,DateStamp) ) 我希望能够根据[GroupID],通过[DateStamp]只列出最新的X记录。踢球者是X>1,所

我使用的是Sybase 12.5服务器,我有一个定义如下的表:

CREATE TABLE SomeTable(
    [GroupID] [int] NOT NULL,
    [DateStamp] [datetime] NOT NULL,
    [SomeName] varchar(100),
    PRIMARY KEY CLUSTERED (GroupID,DateStamp)
)
我希望能够根据[GroupID],通过[DateStamp]只列出最新的X记录。踢球者是X>1,所以普通的老马克斯不会切。我假设有一种非常糟糕的方法可以使用游标来实现这一点,但我想知道是否有一种更简单的方法可以不用这些东西

我知道我错过了一些显而易见的东西,我会因为没有得到它而责备自己,但是。。。。我不明白。请帮忙


有没有一种方法可以通过分组数据找到前X条记录?

这是一种无法缩放的方法

SELECT GroupID, DateStamp, SomeName
FROM SomeTable ST1
WHERE X < 
    (SELECT COUNT(*) 
     FROM SomeTable ST2 
     WHERE ST1.GroupID=ST2.GroupID AND ST2.DateStamp > ST1.DateStamp)

不过,编辑比尔的解决方案更可取。

这里有一个相当难扩展的方法

SELECT GroupID, DateStamp, SomeName
FROM SomeTable ST1
WHERE X < 
    (SELECT COUNT(*) 
     FROM SomeTable ST2 
     WHERE ST1.GroupID=ST2.GroupID AND ST2.DateStamp > ST1.DateStamp)

不过,编辑比尔的解决方案更可取。

根据在线手册,Sybase 12.5支持窗口函数和行号,尽管它们的语法与标准SQL略有不同

试着这样做:

SELECT SP.*
FROM (
    SELECT *, ROW_NUMBER() OVER (windowA ORDER BY [DateStamp] DESC) AS RowNum
    FROM SomeTable
    WINDOW windowA AS (PARTITION BY [GroupID])
) AS SP
WHERE SP.RowNum <= 3
ORDER BY RowNum DESC;

请注意,SELECT列表中列出的列必须与GROUP BY子句中列出的列相同。基本上,您希望此查询返回的s1中的所有列。

根据联机手册,Sybase 12.5支持窗口函数和行号,尽管它们的语法与标准SQL略有不同

试着这样做:

SELECT SP.*
FROM (
    SELECT *, ROW_NUMBER() OVER (windowA ORDER BY [DateStamp] DESC) AS RowNum
    FROM SomeTable
    WINDOW windowA AS (PARTITION BY [GroupID])
) AS SP
WHERE SP.RowNum <= 3
ORDER BY RowNum DESC;

请注意,SELECT列表中列出的列必须与GROUP BY子句中列出的列相同。基本上,s1中您希望此查询返回的所有列。

非常感谢。当我周五开始工作时,我会试试这个,看看它是否有效。这似乎不起作用:关键字“OVER”附近的语法不正确。不过,我会继续努力的。对不起,我想我是把你引向了白费力气。我在上面添加了一个不同的解决方案。呃,这不是您的做法,但是我需要查询的表相对较大,约500K行,并且似乎没有必要的索引。查询只是超时。然而,你所发布的内容是有意义的。我想这就是我要找的。不幸的是,我无法使用它。非常感谢你的回答!是的,如果没有适合您需要运行的查询的索引,任何大小的数据库实际上都是不可用的。您应该使用set showplan on来指导您创建最佳索引。请参阅ASE性能和调整指南第36章。非常感谢。当我周五开始工作时,我会试试这个,看看它是否有效。这似乎不起作用:关键字“OVER”附近的语法不正确。不过,我会继续努力的。对不起,我想我是把你引向了白费力气。我在上面添加了一个不同的解决方案。呃,这不是您的做法,但是我需要查询的表相对较大,约500K行,并且似乎没有必要的索引。查询只是超时。然而,你所发布的内容是有意义的。我想这就是我要找的。不幸的是,我无法使用它。非常感谢你的回答!是的,如果没有适合您需要运行的查询的索引,任何大小的数据库实际上都是不可用的。您应该使用set showplan on来指导您创建最佳索引。请参阅《ASE性能和调整指南》第36章。