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で連続して 2 回の出生がある場合は、両方ともカウントされます。そして、日付が続く場合、両方とも同じ死亡日になります。

于 2013-07-04T18:48:43.143 に答える