1

列を持つテーブルがあります:

USE 'table';  
insert into person values   
('11','xxx','1976-05-10','p1'),  
('11','xxx ','1976-06-11','p1'),  
('11','xxx ','1976-07-21','p2'),  
('11','xxx ','1976-08-31','p2'),  

彼が時系列で変更された場所に関して、その人の開始日と終了日を取得するためのクエリを誰かに提案できますか?

私が書いたクエリ

SELECT PId,Name,min(Start_Date) as sdt, max(Start_Date) as edt, place 
from ** 
group by Place;

私の答えの最初の2行だけを教えてくれます。誰でもクエリを提案できますか??

4

2 に答える 2

1

これはきれいではなく、パフォーマンスはひどいかもしれませんが、少なくとも動作します:

select min(sdt), edt, place
from (
  select A.Start_Date sdt, max(B.Start_Date) edt, A.place
  from person A
       inner join person B on A.place = B.place
                          and A.Start_Date <= B.Start_Date
       left join person C on A.place != C.place
                         and A.Start_Date < C.Start_Date
                         and C.Start_Date < B.Start_Date
  where C.place is null
  group by A.Start_Date, A.place
) X
group by edt, place

アイデアは、行のすべてのペアAB表すということです。は、異なる を持つこれら 2 つの間の任意の行になります。したがって、制限の後、と が同じ範囲に属していることがわかります。つまり、ある場所の行のグループであり、その間に他の場所はありません。これらすべてのペアから、最大の範囲を持つもの、他のすべてを包含するものを特定したいと考えています。これは、2 つのネストされたクエリを使用して行います。内側のものは可能なすべての開始日に対して最大の終了日を選択しますが、外側のものは可能なすべての終了日に対して最小の開始日を選択します。結果は、同じ場所を表す時系列に続く行の最大範囲です。CplaceC.place is nullABgroup by

于 2012-09-05T06:27:23.840 に答える
0

これは次の方法で実現できます。

SELECT Id, PId,
       MIN(Start_Date) AS sdt,
       MAX(Start_Date) as edt,
       IF(`place` <> @var_place_prev, (@var_rank:= @var_rank + 1), @var_rank) AS rank,
       (@var_place_prev := `place`) AS `place`
FROM person, (SELECT @var_rank := 0, @var_place_prev := "") dummy
GROUP BY rank, Place;

例: SQLフィドル

レコードを次の順序で並べたい場合ID:

SELECT Id, PId,
       MIN(Start_Date) AS sdt,
       MAX(Start_Date) as edt,
       `place`
FROM(
     SELECT Id, PId,
            Start_Date
            IF(`place` <> @var_place_prev,(@var_rank:= @var_rank + 1),@var_rank) AS rank,
            (@var_place_prev := `place`) AS `place`
     FROM person, (SELECT @var_rank := 0, @var_place_prev := "") dummy
     ORDER BY ID ASC
    ) a
GROUP BY rank, Place;
于 2012-09-05T06:37:28.410 に答える