Согласно интерактивному руководству, 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
, которые вы хотите, чтобы этот запрос возвращал.