【问题标题】:Sybase SQL: row number over a partitionSybase SQL:分区上的行号
【发布时间】:2021-08-07 22:01:28
【问题描述】:

你能帮帮我吗?我正在尝试了解 Sybase ase SQL 的工作原理。

基本上我有这样的查询:

select ClientId,StartDate,EndDate from TableName

我需要创建一个临时表来存放

ClientID = A, StartDate 20180101, 1
ClientID = A, StartDate 20190101, 2
ClientID = A, StartDate 20200101, 3
ClientID = B, StartDate 20180101, 1
ClientID = B, StartDate 20190101, 2
ClientID = C, StartDate 20190101, 1
ClientID = C, StartDate 20200101, 2

你知道如何创建它吗?我环顾四周,但找不到任何合适的解决方案(rownum 不起作用并正在创建

SELECT row_number = identity(32),t.*
INTO #TempTable

不起作用(在这种情况下,我得到 [1,2,3,4,5,6,7] 而不是 [1,2,3,1,2,1,2]

感谢您的帮助!

【问题讨论】:

  • 对不起,我的意思是临时表
  • Sybase ASE 16 不实现窗口函数。你用的是哪个版本?
  • Adaptive Server Enterprise/16.0 SP01 PL01/EBF 24363 SMP/P/x86_64/Enterprise Linux/ase160sp01plx/3663/64-bit/FBO/

标签: sql window-functions sybase-ase15


【解决方案1】:

OP 没有提供 DDL 表,也没有提供insert 语句的样本集,所以有一些假设:

  • StartDate 是一个 varchar() (为了这个答案;应该能够毫无问题地切换到 datedatetimedatetime
  • EndDate 在所需的输出中不需要(根据 OP 的示例输出)
  • (ClientId, StartDate) 的组合是唯一的(否则建议的答案 - 下面 - 不会产生预期的结果)

样本数据:

create table clients
(ClientId       varchar(10)     null
,StartDate      varchar(10)     null
,EndDate        varchar(20)     null
)
go

insert into clients values ('A', '20180101', null)
insert into clients values ('A', '20190101', null)
insert into clients values ('A', '20200101', null)

insert into clients values ('B', '20180101', null)
insert into clients values ('B', '20190101', null)

insert into clients values ('C', '20190101', null)
insert into clients values ('C', '20200101', null)
go

正如@Impaler 所提到的,Sybase ASE 不支持“窗口函数”,所以我们需要有点创意。

使用自联接的一个想法:

select  c1.ClientId,
        c1.StartDate,
        count(*) as num

from    clients c1
join    clients c2

on      c1.ClientId   = c2.ClientId
and     c1.StartDate >= c2.StartDate

group by c1.ClientId, c1.StartDate
order by 1,2
go

 ClientId   StartDate  num
 ---------- ---------- -----------
 A          20180101             1
 A          20190101             2
 A          20200101             3
 B          20180101             1
 B          20190101             2
 C          20190101             1
 C          20200101             2

注意:对于较大的数据集和/或没有有用索引的情况下,此查询可能表现不佳,ymmv ...



演示如果(ClientId, StartDate) 对不是唯一的会发生什么...

假设我们的数据集如下所示:

insert into clients values ('A', '20180101', null)
insert into clients values ('A', '20190101', null)
insert into clients values ('A', '20200101', null)

insert into clients values ('B', '20180101', null)
insert into clients values ('B', '20190101', null)   -- duplicate (ClientId, StartDate)
insert into clients values ('B', '20190101', null)   -- duplicate (ClientId, StartDate)

insert into clients values ('C', '20190101', null)
insert into clients values ('C', '20200101', null)
go

建议的查询生成:

 ClientId   StartDate  num
 ---------- ---------- -----------
 A          20180101             1
 A          20190101             2
 A          20200101             3

 B          20180101             1
 B          20190101             6     -- oops, only 2 rows for 'B' and the wrong 'num' value for this row

 C          20190101             1
 C          20200101             2

如果建议的查询在 OP 的环境中不起作用,则 OP 可能需要提供minimal, reproducible example;特别是,提供示例create tableinsert into 语句以充分展示真实数据集。

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2014-08-25
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多