0

一点背景:蜜蜂收到一个编号颜色的标签,用于识别它们。标签需要重复使用,因为蜜蜂太多。然而,一个特定的标签永远不会同时使用,蜜蜂的出生和死亡日期都会被记录下来。

数据结构:

TABLE: tags
id  bee_id  tag_date      colony_id     events      tagged_by
=================================================================================
1   G23 2013-06-01  1       birth       ET
2   Y35 2013-06-03  1       birth       ET
3   G23 2013-07-01  NULL        death       ET
4   G23 2013-07-02  2       birth       ET
5   W64 2013-07-03  1       birth       ET
6   Y35 2013-07-15  NULL        death       ET

所需的输出:

bee_id  Status  Birth Date Death Date
======================================================
G23 Dead    2013-06-01  2013-07-01
G23 Alive   2013-07-02  NULL
Y35 Dead    2013-06-03  2013-07-15

我尝试过(但失败了)

select * from
   ( select *
      from tags
      order by tag_date
      where events = "birth"
      limit 1 ) as births
   group by `bee_id`
4

1 回答 1

2

对于这种结构,您希望专注于“出生”并为每个人找到下一个“死亡”。我认为相关子查询是表达此查询的最简单方法:

select t.bee_id, (case when t.death_date is null then 'Alive' else 'Dead' end) as status,
       t.tag_date as birth_date, t.death_date
from (select t.*,
             (select t2.tag_date
              from tags t2
              where t2.bee_id = t.bee_id and
                    t2.events = 'death' and
                    t2.tag_date >= t.tag_date
              order by t2.tag_date
              limit 1
             ) as death_date
      from tags t
      where t.events = 'birth'
     ) t
group by t.bee_id, t.tag_date;

子查询查找每次出生后的第一个死亡记录。注意:此结构假定您的数据与您所说的一样。也就是说,如果您在同一排连续生了两个bee_id孩子,那么它们都被计算在内。如果日期之后,两者将具有相同的死亡日期。

于 2013-07-04T18:48:43.143 回答