有没有办法找到TOP X的记录与分组数据?(Is there a way to find TOP X

2019-10-22 13:47发布

我用的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的记录,但分组的数据?

Answer 1:

根据网上手册中,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希望此查询返回。



Answer 2:

这是一种很好的方式无法扩展!

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

编辑比尔的解决方案远远优于虽然。



文章来源: Is there a way to find TOP X records with grouped data?