【问题标题】:Group by same name of category but different meaning of category [duplicate]按类别名称相同但类别含义不同进行分组[重复]
【发布时间】:2015-10-11 01:28:40
【问题描述】:

我有一张如下表

start_date end_date 类别

26/05/2015 10:05 26/05/2015 10:10 d

26/05/2015 10:17 26/05/2015 10:20 d

26/05/2015 10:35 26/05/2015 10:44 c

26/05/2015 10:50 26/05/2015 10:57 c

26/05/2015 11:05 26/05/2015 11:13 d

26/05/2015 11:27 26/05/2015 11:30 d

我需要按类别分组并取 min(start_date) 和 max(end_date) 但如果没有类别序列,则具有不同的含义。

我想得到这样的结果

start_date end_date 类别

26/05/2015 10:05 26/05/2015 10:20 d

26/05/2015 10:35 26/05/2015 10:57 c

26/05/2015 11:05 26/05/2015 11:30 d

谢谢大家

【问题讨论】:

  • “但是如果没有类别的顺序,它有不同的含义。”是什么意思?

标签: sql sql-server-2012 group-by


【解决方案1】:

另一种选择,添加标识列并使用递归 CTE:

;with CTE (ID,st_date,end_date,category,group_no) as
(select ID,st_date,end_date,category,1 as group_no
 from dates d
 where ID = 1
 union all
 select d.ID,d.st_date,d.end_date,d.category
 ,case when d.category = cte.category then cte.group_no else cte.group_no + 1 end
 from dates d
 inner join CTE cte on d.ID - 1= cte.ID
 )

 select MIN(st_date) as st_date,MAX(end_date) as end_date,category from CTE
 group by group_no,category
 order by st_date asc

[http://sqlfiddle.com/#!3/261c3]

【讨论】:

    【解决方案2】:

    您可以通过为每组连续行分配一个组标识符来实现此目的,其中值相同。我喜欢用不同的行号来做到这一点:

    select min(start_date) as start_date, max(end_date) as end_date, category
    from (select t.*,
                 (row_number() over (order by start_date) -
                  row_number() over (partition by category order by start_date)
                 ) as grp
          from table t
         ) t
    group by category, grp;
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多