sql >> データベース >  >> RDS >> Mysql

内部結合を使用して、テーブル内の特定のレコードと関連するイベントの間の間隔を決定する

    移籍または退院があなたがそのように書くことができるユニークなイベントであると仮定すると

    SELECT
       b.EventTime - a.EventTime        
    FROM
       Histories a
       INNER JOIN Histories b
       ON a.VisitID = b.VisitID
    WHERE
       a.event = 'Admission'
       and
       b.event in ('Transfer', 'Discharge')
    

    最後の転送または退院に興味がある場合は、次のように記述します

    SELECT
       b.EventTime - a.EventTime        
    FROM
       Histories a
       INNER JOIN  Histories b
        ON a.VisitID = b.VisitID
    
       INNER JOIN 
       (SELECT
             VisitId, 
             MAX(HistoryID) HistoryID
        FROM Histories 
        WHERE 
           b.event in ('Transfer', 'Discharge')
        GROUP BY 
           VisitId) maxHistory
       ON b.HistoryID = maxHistoryId.HistoryId
    
    WHERE
       a.event = 'Admission'
    

    ただし、Andriy Mが言及しているように、訪問によって複数の訪問が発生する可能性がある場合は、ギャップと島(特に島)に問題があります

    その場合、次のものが必要です

    SELECT  
           a.VisitId,
           a.Event a_Event, 
           a.Event b_Event, 
           a.EventTime a_EventTime,
           b.EventTime b_EventTime,
           b_EventTime - a_EventTime
    
    FROM   histories a 
           INNER JOIN histories B 
             ON a.visitID = b.visitID 
                AND a.EventTime < b.eventTime 
           INNER JOIN (SELECT a.VisitId, 
                              a.EventTime      a_EventTime, 
                              Min(b.EventTime) b_EventTime 
                       FROM   histories a 
                              INNER JOIN histories B 
                                ON a.visitID = b.visitID 
                                   AND a.EventTime < b.eventTime 
                       GROUP  BY a_EventTime, 
                                 a.VisitId) MinTime 
             ON a.VisitID = MinTime.VisitID 
                AND a.EventTime = a_EventTime 
                AND b.EventTime = b_EventTime 
    

    デモ

    次のサンプルデータを使用する

    CREATE TABLE Histories 
        (
         HistoryId int auto_increment primary key, 
         VisitId int,
         Location varchar(20),
         Event varchar(20), 
         EventTime datetime
        );
    
    INSERT INTO Histories
    (VisitId, Location, Event, EventTime)
    VALUES
    (1, 'A', 'Admission', '2012-01-01'),
    (1, 'A', 'Discharge', '2012-01-03'),
    (2, 'B', 'Admission', '2012-01-02'),
    (2, 'C', 'Transfer', '2012-01-05'),
    (2, 'C', 'Discharge', '2012-01-06'),
    (3, 'D', 'Admission', '2012-01-06'),
    (3, 'E', 'Transfer', '2012-01-07'),
    (3, 'F', 'Transfer', '2012-01-08'),
    (3, 'F', 'Discharge', '2012-01-10');
    

    次の結果が得られます

    VISITID    A_EVENT   B_EVENT    A_EVENTTIME                     B_EVENTTIME                     B_EVENTTIME - A_EVENTTIME
    1          Admission Discharge  January, 01 2012 00:00:00-0800  January, 03 2012 00:00:00-0800  2000000
    2          Admission Transfer   January, 02 2012 00:00:00-0800  January, 05 2012 00:00:00-0800  3000000
    2          Transfer  Discharge  January, 05 2012 00:00:00-0800  January, 06 2012 00:00:00-0800  1000000
    3          Admission Transfer   January, 06 2012 00:00:00-0800  January, 07 2012 00:00:00-0800  1000000
    3          Transfer  Transfer   January, 07 2012 00:00:00-0800  January, 08 2012 00:00:00-0800  1000000
    3          Transfer  Discharge  January, 08 2012 00:00:00-0800  January, 10 2012 00:00:00-0800  2000000
    

    注:

    • これは、対応する排出/転送がまだない入場/転送を気にしないことを前提としています。
    • レコードが入力された後もeventTimeが変更されないことがわかっている場合は、偶数時間の代わりにhistoryIDを使用してイベントの順序を決定できます。
    • お好みの形式でイベント時間の差を取得する方法を知っています


    1. 時系列データを効率的に保存する:mySQLまたはフラットファイル?多くのテーブル(またはファイル)またはWHERE条件のクエリ?

    2. 外部キーの制約:ONUPDATEおよびONDELETEを使用する場合

    3. save()でSequelizeからMySQL自動インクリメント主キーを取得するにはどうすればよいですか?

    4. ONDUPLICATEKEYを使用してINSERTINTO...SELECTを実行する方法