2017-05-03 120 views
2

我有一個SQL表,包含ID:ADate,XValue和Type。對於每個「Type」值,我想檢索最近的行(每ADate),最近的行(每ADate)以及包含最高「XValue」值的行。在相同的SQL查詢中選擇最大值和最小值

是否可以通過單個SQL查詢執行?我嘗試了幾次,但沒有成功。

+0

RDBMS什麼你實際使用?當你說「註冊」時,你的意思是「行」? –

+0

您嘗試過哪些查詢? – LordBaconPants

+0

MS SQL Server 2014 –

回答

1
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 
+0

非常好!非常感謝! –

2

使用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) 
1

一種方法是使用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);