【问题标题】:Min() and Max() based on partition in sql serverMin() 和 Max() 基于 sql server 中的分区
【发布时间】:2019-12-24 15:39:52
【问题描述】:

我想使用 min & max 函数,但要符合某些条件。

Create Table #Test (Id Int Identity(1,1), Category Varchar(100), DateTimeStamp DateTime)



    Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 01:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 02:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 03:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 04:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 05:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c2','2019-08-13 06:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c2','2019-08-13 07:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c2','2019-08-13 08:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c2','2019-08-13 09:00:13.503')
        Insert into #Test (Category,DateTimeStamp) values ('c2','2019-08-13 10:00:13.503')  
        Insert into #Test (Category,DateTimeStamp) values ('c1','2019-08-13 11:00:13.503')

带有输出的当前查询

select category, min(DateTimeStamp) as minn , max(DateTimeStamp) as maxx from #Test
group by category

电流输出

预期输出

【问题讨论】:

  • 这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像。
  • 我还分享了示例 sql 数据脚本和当前 sql 查询。
  • 那真是太棒了!

标签: sql sql-server max min


【解决方案1】:

您可以在下面尝试 - 这是一个差距和孤岛问题

DEMO

select category, min(datetimestamp),max(datetimestamp)
from
(
select *,row_number() over(order by datetimestamp) -
row_number() over(partition by category order by datetimestamp) as rn2
from #Test
)A group by category,rn2 order by 2

输出:

category       minval               maxval
c1             13/08/2019 01:00:13  13/08/2019 05:00:13
c2             13/08/2019 06:00:13  13/08/2019 10:00:13
c1             13/08/2019 11:00:13  13/08/2019 11:00:13

【讨论】:

    【解决方案2】:

    对于 postgres:

    SELECT category, min(DateTimeStamp) as minn , max(DateTimeStamp) as maxx 
    FROM (Select *,
          SUM(CASE WHEN Category <> PrevCategory THEN 1 ELSE 0 END)  OVER (ORDER BY 
          ID,Category,DateTimeStamp) As partition
          From (Select * ,LAG (Category, 1) OVER (ORDER BY ID) AS PrevCategory From Test)  As 
               help) As helper 
    GROUP BY category,partition;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多