使用多个聚合函数获取行的T-SQL查询

使用多个聚合函数获取行的T-SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下问题。我需要按照最小秩、最大结束日期、最大开始日期和最大序列号的顺序获取每个不同用户id的行。本质上,我想要一个用户排名最高、最近的mair\u ID。我试图避免创建单独的临时表,并连接以下聚合函数: select USER_ID , SEQ_NBR , BEGIN_DATE , END_DATE , MAJOR_RANK , MAJOR_ID , DEGREE_CODE into #major0 from majors select U

我有以下问题。我需要按照最小秩、最大结束日期、最大开始日期和最大序列号的顺序获取每个不同用户id的行。本质上,我想要一个用户排名最高、最近的
mair\u ID
。我试图避免创建单独的临时表,并连接以下聚合函数:

select USER_ID
    , SEQ_NBR
    , BEGIN_DATE
    , END_DATE
    , MAJOR_RANK
    , MAJOR_ID
    , DEGREE_CODE
into #major0
from majors

select USER_ID
    , MIN(MAJOR_RANK) as MAJOR_RANK
into #major1
from #major0
group by USER_ID

select #major0.USER_ID
    , #major0.MAJOR_RANK
    , MAX(#major0.END_DATE) as END_DATE
into #major2
from #major0
inner join #major1 on #major0.USER_ID = #major1.USER_ID and #major0.MAJOR_RANK = #major1.MAJOR_RANK
group by #major0.USER_ID
    , #major0.MAJOR_RANK
等等

直到我到达满足所有条件的那一行,然后从原始查询中重新连接所有字段。这有意义吗?写这篇文章需要做大量的工作,我无法创建它的视图,除非我创建了一个长得离谱的子查询集,我不认为我可以在所有这些字段的子查询中使用
MIN(MAJOR\u RANK)OVER(PARTITION BY USER\u ID)
,因为我会丢失不满足所有字段的记录


任何建议都会有帮助!谢谢大家!

我看不出
序列号是什么,但您很可能可以使用带

;with cte as (
  select 
      user_id
    , begin_date
    , end_date
    , major_rank
    , major_id
    , degree_code
    , rn = row_number() over (
        partition by user_id 
        order by major_rank asc, end_date desc, begin_date desc /*, sequence_number? desc*/
        )
from majors
)
select 
    user_id
  , begin_date
  , end_date
  , major_rank
  , major_id
  , degree_code
from cte
where rn = 1
没有
cte

select 
    user_id
  , begin_date
  , end_date
  , major_rank
  , major_id
  , degree_code
from (
  select 
      user_id
    , begin_date
    , end_date
    , major_rank
    , major_id
    , degree_code
    , rn = row_number() over (
        partition by user_id 
        order by major_rank asc, end_date desc, begin_date desc /*, sequence_number? desc*/
        ) 
from majors
) sub
where rn = 1

我看不出
序列号是什么,但您很可能可以使用带

;with cte as (
  select 
      user_id
    , begin_date
    , end_date
    , major_rank
    , major_id
    , degree_code
    , rn = row_number() over (
        partition by user_id 
        order by major_rank asc, end_date desc, begin_date desc /*, sequence_number? desc*/
        )
from majors
)
select 
    user_id
  , begin_date
  , end_date
  , major_rank
  , major_id
  , degree_code
from cte
where rn = 1
没有
cte

select 
    user_id
  , begin_date
  , end_date
  , major_rank
  , major_id
  , degree_code
from (
  select 
      user_id
    , begin_date
    , end_date
    , major_rank
    , major_id
    , degree_code
    , rn = row_number() over (
        partition by user_id 
        order by major_rank asc, end_date desc, begin_date desc /*, sequence_number? desc*/
        ) 
from majors
) sub
where rn = 1

听起来可以使用递归CTE。问题是我们不知道您要做什么,也不知道您的表或数据是什么样子。这是一个很好的起点。听起来可以使用递归CTE。问题是我们不知道您要做什么,也不知道您的表或数据是什么样子。这是一个很好的起点。对太棒了。我知道这将是一种子查询类型,具有
over(partition by)
,但我没有想到使用
row\u number()
。谢谢大家!@talbe009很乐意帮忙!对太棒了。我知道这将是一种子查询类型,具有
over(partition by)
,但我没有想到使用
row\u number()
。谢谢大家!@talbe009很乐意帮忙!