根據聯機手冊,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
的所有列。
如果這樣起作用,它似乎是最好的,因爲它是一個單一的查詢。 – Justin 2010-06-01 22:24:54
非常感謝。我會在星期五上班時嘗試一下,看看它是否有效。 – 2010-06-03 02:33:49
這似乎不起作用:「關鍵字'OVER'的語法不正確。」不過,我會繼續嘗試。 – 2010-06-04 13:43:17