使用多个聚合函数获取行的T-SQL查询
我有以下问题。我需要按照最小秩、最大结束日期、最大开始日期和最大序列号的顺序获取每个不同用户id的行。本质上,我想要一个用户排名最高、最近的使用多个聚合函数获取行的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
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很乐意帮忙!