[英]Sybase SQL: row number over a partition
你能幫幫我嗎? 我試圖了解 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]
謝謝您的幫助!
OP 沒有提供表格 DDL,也沒有提供一組insert
語句的示例,所以有一些假設:
StartDate
是一個 varchar() (為了這個答案;應該能夠切換到date
, datetime
或datetime
沒有任何問題)EndDate
在所需的 output 中不需要(根據 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 可能需要提供一個最小的、可重現的示例; 特別是,提供一個示例create table
和insert into
語句,以充分展示真實的數據集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.