我用的Sybase 12.5服务器工作,我有一个表定义为这样的:
CREATE TABLE SomeTable(
[GroupID] [int] NOT NULL,
[DateStamp] [datetime] NOT NULL,
[SomeName] varchar(100),
PRIMARY KEY CLUSTERED (GroupID,DateStamp)
)
我希望能够列出,每[组ID],只有[日期戳]最新的X记录。 踢球者是X> 1,所以普通的旧MAX()将不会削减它。 我假设有一个奇妙的讨厌的方式使用游标和什么,而不是要做到这一点,但我不知道是否有没有的东西简单的方法。
我知道我失去了一些东西公然明显的,我会踢自己没有得到它,但是....我没有得到它。 请帮忙。
有没有办法找到TOP X的记录,但分组的数据?
根据网上手册中,Sybase 12.5支持WINDOW
功能和ROW_NUMBER()
但它们的语法与标准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;
我没有的Sybase的一个实例,所以我没有测试过这一点。 我只是合成从DOC这个例子。
我犯了一个错误。 我一直在寻找的文档是Sybase SQL Anywhere的11.看来的Sybase ASA不支持WINDOW
子句可言,甚至在最新的版本。
下面是可以完成同样的事情,另一个查询。 您可以使用自联接SomeTable的每一行匹配与同组ID和以后的日期戳的所有行。 如果有三个或更少的后来行,那么我们已经拿到了三强之一。
SELECT s1.[GroupID], s1.[Foo], s1.[Bar], s1.[Baz]
FROM SomeTable s1
LEFT OUTER JOIN SomeTable s2
ON s1.[GroupID] = s2.[GroupID] AND s1.[DateStamp] < s2.[DateStamp]
GROUP BY s1.[GroupID], s1.[Foo], s1.[Bar], s1.[Baz]
HAVING COUNT(*) < 3
ORDER BY s1.[DateStamp] DESC;
请注意,您必须列出在相同的列SELECT
,你在列表列表GROUP BY
子句。 基本上,所有列s1
希望此查询返回。
这是一种很好的方式无法扩展!
SELECT GroupID, DateStamp, SomeName
FROM SomeTable ST1
WHERE X <
(SELECT COUNT(*)
FROM SomeTable ST2
WHERE ST1.GroupID=ST2.GroupID AND ST2.DateStamp > ST1.DateStamp)
编辑比尔的解决方案远远优于虽然。