2010-06-01 122 views
1

我用的Sybase 12.5服務器工作,我有一個表定義爲這樣:有沒有辦法找到分組數據的TOP X記錄?

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記錄,但有分組數據?

回答

3

根據聯機手冊,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的一個實例,所以我沒有測試過這一點。我只是從文檔中綜合這個例子。


我犯了一個錯誤。我所看到的文檔是Sybase SQL Anywhere 11.看起來,Sybase ASA根本不支持WINDOW子句,即使在最新版本中也是如此。

這是另一個可以完成同樣事情的查詢。您可以使用自連接將SomeTable的每一行匹配到具有相同GroupID和更高版本DateStamp的所有行。如果後面有三排或更少的排,那麼我們有前三排之一。

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的所有列。

+0

如果這樣起作用,它似乎是最好的,因爲它是一個單一的查詢。 – Justin 2010-06-01 22:24:54

+0

非常感謝。我會在星期五上班時嘗試一下,看看它是否有效。 – 2010-06-03 02:33:49

+0

這似乎不起作用:「關鍵字'OVER'的語法不正確。」不過,我會繼續嘗試。 – 2010-06-04 13:43:17

1

這是一個相當不可思議的方式!

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

編輯比爾的解決方案遠遠優於雖然。

相關問題