问题描述
我想从某个值中获得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
或者,如果cid
和date
的值没有相应更改,则可以使用条件聚合:
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
。如果您希望以其他方式进行操作,则可以轻松地调整查询(基本上是切换cid
和cdate
)。