如何使用分区将最小值/最大值转换为SQL Server中的列?

问题描述

我想从某个值中获得MIN和MAX并将它们放在彼此相邻的列中。这是我的查询,但我不知道如何转置值...

SELECT *,MIN([CID]) OVER (PARTITION BY [TID] ORDER BY [TID]) MinID,MAX([CID]) OVER (PARTITION BY [TID] ORDER BY [TID]) MaxID

给出:

TID       CID DATE
123456789 1   01JAN
123456789 2   02JAN
123456789 3   03JAN
123456789 4   04JAN

结果:

TID       CID DATE   MIN MAX DATEMIN DATEMAX
123456789 1   01JAN  1   4   01JAN   04JAN

解决方法

这里简单的聚合不够好吗?

select 
    tid,min(cid) min_cid,max(cid) max_cid,min(date) min_date,max(date) max_date
from mytable
group by tid

或者,如果ciddate的值没有相应更改,则可以使用条件聚合:

select
    tid,max(case when rn_asc  = 1 then cid end) cid_at_min_date,max(case when rn_desc = 1 then cid end) cid_at_max_date,max(date) max_date

from (
    select 
        t.*,row_number() over(partition by tid order by cdate asc ) rn_asc,row_number() over(partition by tid order by cdate desc) rn_desc
    from mytable t
) t
where 1 in (rn_asc,rn_desc)
group by tid

此命令按cdate排序记录,并为您提供与最小和最大日期相对应的cid。如果您希望以其他方式进行操作,则可以轻松地调整查询(基本上是切换cidcdate)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...