【问题标题】:How to transpose min/max value to columns in SQL Server using Partition?如何使用分区将最小值/最大值转换为 SQL Server 中的列?
【发布时间】:2020-12-14 17:55:22
【问题描述】:

我想从某个值中获取 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

【问题讨论】:

  • 枢轴是你所追求的。

标签: sql-server pivot max min window-functions


【解决方案1】:

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

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

或者,如果cids 和dates 没有相应变化,您可以使用条件聚合:

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,
    min(date) min_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 对记录进行排序,并为您提供与最小和最大日期相对应的cids。如果您想要反过来的话,您可以轻松地调整查询(基本上,切换cidcdate)。

【讨论】:

  • 嗨@GMB结果不一致有一些值在cid_at_max_date和max_date值中为空值与min_date的值相同,顺便说一下日期是微不足道的虽然CID是......因此,无论最小值和最大值是多少,不管值如何,让我们的一天 CID 1,2,3,4 它可能是 1=1jan,2=1jan 最重要的是最小值和最大值(1,4)及其等效日期。Thnx。
  • @ThirdyLeon:好的,然后按照说明,只需在查询中切换cidcdate
  • 嗨@GMB,很抱歉打扰你,但效果相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多