2017-02-19 104 views
2

已经找了几个小时了,我找不到任何相关的东西,所以我会问。我有一个这样的数据库:显示同一个组的SQL数据库出现两次或更多

id | date  | name 
1 |2017-01-01 | sarah 
2 |2017-01-02 | sarah 
3 |2017-01-03 | john 
4 |2017-01-04 | john 
5 |2017-01-05 | john 
6 |2017-01-06 | sarah 
7 |2017-01-07 | sarah 
8 |2017-01-08 | eddy 
9 |2017-01-09 | eddy 

我希望做一个清单象下面这样:

start date | end date | name 
2017-01-01 | 2017-01-02 | sarah 
2017-01-03 | 2017-01-05 | john 
2017-01-06 | 2017-01-07 | sarah 
2017-01-08 | 2017-01-09 | eddy 

我怎样才能做到这一点?一直在尝试使用:

SELECT MIN(date) as mindate, MAX(date) as maxdate, name 
FROM 'table' 
GROUP BY name 
ORDER BY date DESC 

,但我得到这些来代替:

start date | end date | name 
2017-01-01 | 2017-01-07 | sarah 
2017-01-03 | 2017-01-05 | john  
2017-01-08 | 2017-01-09 | eddy 

请注意,在列表中我想,这个名字SARAH出现了两次,并与GROUP BY,萨拉只出现过一次。 ..

+0

确定日期是开始日期还是结束日期的规则是什么? – DaveCoast

+1

@DaveCoast'id'确定空隙和岛屿。 –

回答

1

一个选项是使用行号变量来标识每个岛的开始和结束日期。最终结果与您原先想要的类似,除了现在我们正在为每个岛屿开始和结束日期,而不是整个表格中的每个名称。

SET @island_number = 0; 
SET @name = ''; 

SELECT MIN(t.date) AS start_date, 
     MAX(t.date) AS end_date, 
     t.name 
FROM 
(
    SELECT @island_number:=CASE WHEN @name = name 
           THEN @island_number 
           ELSE @island_number + 1 
          END AS gn, 
      @name:=name AS name, 
      date 
    FROM yourTable 
    ORDER BY id 
) t 
GROUP BY t.gn, t.name 
0

请尝试以下查询。

SELECT 
MIN(_date) as start_date 
,MAX(_date) as end_date 
,name_new as name 
FROM 
(
Select 
    _date 
    ,if(name = @prev, @seq, @seq := @seq + 1) as seq 
    ,if(name = @prev, name, @prev := name) as name_new 
From test, (SELECT @seq := 0, @prev := '') AS init 
Order by `_date` 
) as der 
    group by name_new, seq 
    order by seq 
相关问题