在同一SQL查询中选择最大值和最小值

时间:2017-05-03 20:49:24

标签: sql sql-server sql-server-2014

我有一个带有列的SQL表:ID,ADate,XValue和Type。对于每个" Type"值,我想要检索最近的行(每个ADate),最近的行(每个ADate)以及包含最高行" XValue"的行。值。

是否可以通过单个SQL查询执行?我尝试了几次但没有成功。

3 个答案:

答案 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 :(得分: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);

答案 2 :(得分: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