2017-05-03 78 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);