我有一個SQL表,包含ID:ADate,XValue和Type。對於每個「Type」值,我想檢索最近的行(每ADate),最近的行(每ADate)以及包含最高「XValue」值的行。在相同的SQL查詢中選擇最大值和最小值
是否可以通過單個SQL查詢執行?我嘗試了幾次,但沒有成功。
我有一個SQL表,包含ID:ADate,XValue和Type。對於每個「Type」值,我想檢索最近的行(每ADate),最近的行(每ADate)以及包含最高「XValue」值的行。在相同的SQL查詢中選擇最大值和最小值
是否可以通過單個SQL查詢執行?我嘗試了幾次,但沒有成功。
select ID, ADate, XValue,[Type]
from (
select *
,row_number() over (partition by type order by adate asc) AS DateSeq
,row_number() over (partition by type) AS TypeCount
,row_number() over (partition by type order by xvalue desc) AS ValueSeq
from t
) as tt
where tt.DateSeq=1 OR tt.DateSeq=tt.TypeCount OR tt.ValueSeq=1
非常好!非常感謝! –
使用row_number()
你可以做這樣的事情:
select ID, ADate, XValue and Type
from (
select *
, min_adate = row_number() over (partition by type order by adate asc)
, max_adate = row_number() over (partition by type order by adate desc)
, max_xvalue = row_number() over (partition by type order by xvalue desc)
from t
) as sub
where 1 in (min_adate,max_adate,max_xvalue)
/* --also could be written as
where min_adate = 1
or max_adate = 1
or max_xvalue = 1
*/
使用common table expression可能使其更具可讀性。
;with cte as (
select *
, min_adate = row_number() over (partition by type order by adate asc)
, max_adate = row_number() over (partition by type order by adate desc)
, max_xvalue = row_number() over (partition by type order by xvalue desc)
from t
)
select ID, ADate, XValue and Type
from cte
where 1 in (min_adate,max_adate,max_xvalue)
一種方法是使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by type order by aDate desc) as seqnum_adate_desc,
row_number() over (partition by type order by aDate asc) as seqnum_adate_asc,
row_number() over (partition by type order by XValue desc) as seqnum_xvalue_desc
from t
) t
where 1 in (seqnum_adate_desc, seqnum_adate_asc, seqnum_xvalue_desc);
RDBMS什麼你實際使用?當你說「註冊」時,你的意思是「行」? –
您嘗試過哪些查詢? – LordBaconPants
MS SQL Server 2014 –