替代在Sybase SQL窗口功能(Alternative to SQL window functi

2019-09-27 04:51发布

我工作的Sybase的Adaptive Server Enterprise(12.5.0.3版)。 尝试使用Row_number() OVER (Partition by columnname order by columnname) 。 当我执行查询它抛出一个异常,说OVER附近的语法不正确。 我已经寻找了Sybase数据库适当的ROW_NUMBER()语法,但并没有什么错的语法。 我想这是我使用的是不支持的Sybase版本row_number() OVER 。 我甚至尝试dense_rank() OVER ,但我得到同样的错误。

我需要知道是否真的是Sybase的哪些是不支持的关键词低版本的语法问题,或者因为它?

如果问题是与版本,则是有ROW_NUMBER OVER和DENSE_RANK()OVER了Sybase数据库的任何选择。

我的查询:

select  cr.firstname, cr.lastname, cr.dob,cr.phone,
          row_number() over (patition by cr.dob order by createddate) "rank"       
          from ff.CrossReferenceTable cr

错误信息:

Server Message:  Number  156, Severity  15
               Server 'MyServer', Line 1:
               Incorrect syntax near the keyword 'over'.

Answer 1:

没错,不幸的Sybase ASE不支持row_number()函数以及rank()dense_rank() 然而,在一些简单的情况下,如果不使用分区子句也可以在喜欢的方式转换

select rank=identity(music), * into #new_temp_tab1 from CrossReferenceTable order by createddate
select firstname, lastname, dob, phone, rank from #new_temp_tab1

在你的情况下,它的将是更复杂一点,我可以推荐使用光标临时表来模拟row_number()的行为在分区。 请看看下面的例子:

create table CrossReferenceTable(firstname varchar(50),lastname varchar(50), dob int,phone char(10), createddate date)

create proc sp_CrossReferenceTable
as
begin
declare @i int
declare @cur_firstname varchar(50)
declare @cur_lastname varchar(50)
declare @cur_dob int
declare @cur_phone varchar(10)
declare @cur_rank int
declare cur cursor for select cr.firstname, cr.lastname, cr.dob,cr.phone, count(*) AS "rank" from CrossReferenceTable cr
group by cr.dob ORDER BY cr.dob, createddate
CREATE TABLE #CrossReferenceTable_TEMP(firstname varchar(50),lastname varchar(50), dob int,phone char(10),rank INT)
open cur
fetch cur into @cur_firstname , @cur_lastname , @cur_dob , @cur_phone , @cur_rank
set @i = @cur_rank
while @@SQLSTATUS = 0 
begin
if @i = 0
set @i = @cur_rank
insert into #CrossReferenceTable_TEMP select @cur_firstname , @cur_lastname , @cur_dob , @cur_phone, 
case when @cur_rank > 1 then @cur_rank - (@i - 1) ELSE @cur_rank end as "rank"
set @i = @i - 1
fetch cur into @cur_firstname , @cur_lastname , @cur_dob , @cur_phone , @cur_rank
end
select firstname, lastname, dob, phone, rank from #CrossReferenceTable_TEMP
end

exec sp_CrossReferenceTable


文章来源: Alternative to SQL window functions in Sybase