簡體   English   中英

Sybase SQL:分區上的行號

[英]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() (為了這個答案;應該能夠切換到datedatetimedatetime沒有任何問題)
  • 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 tableinsert into語句,以充分展示真實的數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM