微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sybase SQL:分区上的行号

如何解决Sybase SQL:分区上的行号

请你帮帮我好吗?我想了解 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,1
ClientID = B,2
ClientID = C,1
ClientID = C,2

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

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

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

感谢您的帮助!

解决方法

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','20200101',null)

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

insert into clients values ('C',null)
insert into clients values ('C',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',null)   -- duplicate (ClientId,StartDate)
insert into clients values ('B',StartDate)

insert into clients values ('C',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 语句以充分展示真实数据集。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?