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

テーブルのどの行が(ある列の順に)別のテーブルの行に対応しますか?

    これに必要なSQLは残酷です。オプティマイザーにかなり深刻なトレーニングを提供します。

    質問と質問の後のコメントから判断すると、大きなテーブル内の特定のユーザーIDのイベントのシーケンスがすべて隣接するイベント間の一定の間隔内にある場合、それらを「連続」として扱うことが望まれます。例として、固定間隔は3時間になります。私はIBMInformixDynamic Server用にコーディングしています(議論のために、バージョン11.70ですが、11.50でも問題なく動作します)。これは、私が説明する必要のある特異な表記法があることを意味します。具体的には、表記3 UNITS HOUR 3時間の間隔を示します。 INTERVAL(3) HOUR TO HOURと書くこともできます。 SQLのInformix方言で、またはINTERVAL '3' HOURとして 標準SQLで。

    SQL、特に複雑なSQLを生成するには、いくつかの重要な手法があります。 1つは、SQLを段階的に構築し、段階的に作成して、最終結果を組み立てることです。もう1つは、自分が何を求めているのかを明確に指定することです。

    次の表記では、「同じUser_IDの修飾」は常に式の一部であると見なす必要があります。

    大きなテーブルには、小さなテーブルに参加する前に検討したい範囲の3つのカテゴリがあります。

    1. イベントの前にイベント時間が十分に近い行も、イベントの後にイベント時間が十分に近い行もないエントリ。これは、開始時刻と終了時刻が同じ時間範囲です。
    2. それ自体は十分に近いが、十分に近いペアの初期イベントより前のイベントも、十分に近いペアの後期イベントより後のイベントもない、テーブル内のエントリのペアペア間のイベントでもありません。
    3. 次のようなテーブル内の3つ以上のエントリのシーケンス:
      • 十分に近い最も早いイベントE1よりも早いイベントはありません
      • 十分に近い最新のイベントE2より後のイベントはありません
      • 最も早いものよりも遅く、最も早いものに十分近いイベントE3
      • 最新よりも早く、最新に十分近いイベントE4(E4はE3と同じイベントである可能性があります)
      • E5とE6の間にイベントがないが、E5とE6の間のギャップが大きすぎて数えられない、最も早いものと最も遅いものの間にイベントE5、E6のペアはありません。

    説明からわかるように、これは恐ろしいSQLになります!

    NB:コードはテストされました。いくつかの(主に小さな)変更が必要でした。マイナーな不要な変更の1つは、中間クエリにORDERBY句を追加したことです。もう1つの不要な変更は、検証のために小さなテーブルから他のデータを選択することでした。この改訂は、msh210 によって投稿された修正バージョンを調査せずに行われました。 。

    また、これが最小限の定式化であるとは確信が持てないことにも注意してください。 3つのSELECTステートメントのUNIONではなく、1つのSELECTステートメントですべての範囲を分類することが可能かもしれません(その場合は良いでしょう)。

    シングルトン範囲

    -- Ranges of exactly 1 event
    SELECT lt1.user_id, lt1.event_time AS min_time, lt1.event_time AS max_time
      FROM Large_Table AS lt1
     WHERE NOT EXISTS -- an earlier event that is close enough
           (SELECT *
              FROM Large_Table AS lt3
             WHERE lt1.user_id = lt3.user_id
               AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
               AND lt3.event_time < lt1.event_time
           )
       AND NOT EXISTS -- a later event that is close enough
           (SELECT *
              FROM Large_Table AS lt4
             WHERE lt1.user_id = lt4.user_id
               AND lt4.event_time > lt1.event_time
               AND lt4.event_time < lt1.event_time + 3 UNITS HOUR
           )
    ORDER BY User_ID, Min_Time;
    

    ダブルトン範囲

    -- Ranges of exactly 2 events
    SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
      FROM Large_Table AS lt1
      JOIN Large_Table AS lt2
        ON lt1.user_id = lt2.user_id
       AND lt1.event_time < lt2.event_time
       AND lt2.event_time < lt1.event_time + 3 UNITS HOUR
     WHERE NOT EXISTS -- an earlier event that is close enough
           (SELECT *
              FROM Large_Table AS lt3
             WHERE lt1.user_id = lt3.user_id
               AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
               AND lt3.event_time < lt1.event_time
           )
       AND NOT EXISTS -- a later event that is close enough
           (SELECT *
              FROM Large_Table AS lt4
             WHERE lt1.user_id = lt4.user_id
               AND lt4.event_time > lt2.event_time
               AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
           )
       AND NOT EXISTS -- any event in between
           (SELECT *
              FROM Large_Table AS lt5
             WHERE lt1.user_id = lt5.user_id
               AND lt5.event_time > lt1.event_time
               AND lt5.event_time < lt2.event_time
           )
    ORDER BY User_ID, Min_Time;
    

    外側のWHERE句に3時間の基準を追加しました。

    複数のイベント範囲

    -- Ranges of 3 or more events
    SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
      FROM Large_Table AS lt1
      JOIN Large_Table AS lt2
        ON lt1.user_id = lt2.user_id
       AND lt1.event_time < lt2.event_time
     WHERE NOT EXISTS -- an earlier event that is close enough
           (SELECT *
              FROM Large_Table AS lt3
             WHERE lt1.user_id = lt3.user_id
               AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
               AND lt3.event_time < lt1.event_time
           )
       AND NOT EXISTS -- a later event that is close enough
           (SELECT *
              FROM Large_Table AS lt4
             WHERE lt1.user_id = lt4.user_id
               AND lt4.event_time > lt2.event_time
               AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
           )
       AND NOT EXISTS -- a gap that's too big in the events between first and last
           (SELECT *
              FROM Large_Table AS lt5 -- E5 before E6
              JOIN Large_Table AS lt6
                ON lt5.user_id = lt6.user_id
               AND lt5.event_time < lt6.event_time
             WHERE lt1.user_id = lt5.user_id
               AND lt6.event_time < lt2.event_time
               AND lt5.event_time > lt1.event_time
               AND (lt6.event_time - lt5.event_time) > 3 UNITS HOUR
               AND NOT EXISTS -- an event in between these two
                   (SELECT *
                      FROM Large_Table AS lt9
                     WHERE lt5.user_id = lt9.user_id
                       AND lt9.event_time > lt5.event_time
                       AND lt9.event_time < lt6.event_time
                   )
           )
       AND EXISTS -- an event close enough after the start
           (SELECT *
              FROM Large_Table AS lt7
             WHERE lt1.user_id = lt7.user_id
               AND lt1.event_time < lt7.event_time
               AND lt7.event_time < lt1.event_time + 3 UNITS HOUR
               AND lt7.event_time < lt2.event_time
           )
       AND EXISTS -- an event close enough before the end
           (SELECT *
              FROM Large_Table AS lt8
             WHERE lt2.user_id = lt8.user_id
               AND lt2.event_time > lt8.event_time
               AND lt8.event_time > lt2.event_time - 3 UNITS HOUR
               AND lt8.event_time > lt1.event_time
           )
    ORDER BY User_ID, Min_Time;
    

    「大きなギャップ」サブクエリに省略されたネストされたNOTEXISTS句を追加しました。

    大きなテーブルのすべての範囲

    明らかに、最後の表の範囲の完全なリストは、上記の3つのクエリの和集合です。

    クエリが十分に面白くないとして削除されました。これは、上記の個別のクエリの3ウェイUNIONにすぎません。

    最終クエリ

    最後のクエリは、小さなテーブルのエントリに十分近い恐ろしい3部構成のUNIONの結果で、範囲がある場合はそれを見つけます。小さなテーブルの1つのエントリがたとえば13:00になり、大きなテーブルの範囲が11:00に終了し、別のエントリが15:00に開始する場合があります。大きなテーブルからの2つの範囲は別々です(それらの間のギャップは4時間です)が、小さなテーブルのエントリは、数えるのに十分に両方に近いです。 [テストはこのケースを対象としています。 ]

    SELECT S.User_id, S.Event_Time, L.Min_Time, L.Max_Time, S.Other_Data
      FROM Small_Table AS S
      JOIN (
            -- Ranges of exactly 1 event
            SELECT lt1.user_id, lt1.event_time AS min_time, lt1.event_time AS max_time
              FROM Large_Table AS lt1
             WHERE NOT EXISTS -- an earlier event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt3
                     WHERE lt1.user_id = lt3.user_id
                       AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
                       AND lt3.event_time < lt1.event_time
                   )
               AND NOT EXISTS -- a later event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt4
                     WHERE lt1.user_id = lt4.user_id
                       AND lt4.event_time > lt1.event_time
                       AND lt4.event_time < lt1.event_time + 3 UNITS HOUR
                   )
            UNION
            -- Ranges of exactly 2 events
            SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
              FROM Large_Table AS lt1
              JOIN Large_Table AS lt2
                ON lt1.user_id = lt2.user_id
               AND lt1.event_time < lt2.event_time
               AND lt2.event_time < lt1.event_time + 3 UNITS HOUR
             WHERE NOT EXISTS -- an earlier event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt3
                     WHERE lt1.user_id = lt3.user_id
                       AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
                       AND lt3.event_time < lt1.event_time
                   )
               AND NOT EXISTS -- a later event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt4
                     WHERE lt1.user_id = lt4.user_id
                       AND lt4.event_time > lt2.event_time
                       AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
                   )
               AND NOT EXISTS -- any event in between
                   (SELECT *
                      FROM Large_Table AS lt5
                     WHERE lt1.user_id = lt5.user_id
                       AND lt5.event_time > lt1.event_time
                       AND lt5.event_time < lt2.event_time
                   )
            UNION
            -- Ranges of 3 or more events
            SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
              FROM Large_Table AS lt1
              JOIN Large_Table AS lt2
                ON lt1.user_id = lt2.user_id
               AND lt1.event_time < lt2.event_time
             WHERE NOT EXISTS -- an earlier event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt3
                     WHERE lt1.user_id = lt3.user_id
                       AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
                       AND lt3.event_time < lt1.event_time
                   )
               AND NOT EXISTS -- a later event that is close enough
                   (SELECT *
                      FROM Large_Table AS lt4
                     WHERE lt1.user_id = lt4.user_id
                       AND lt4.event_time > lt2.event_time
                       AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
                   )
               AND NOT EXISTS -- a gap that's too big in the events between first and last
                   (SELECT *
                      FROM Large_Table AS lt5 -- E5 before E6
                      JOIN Large_Table AS lt6
                        ON lt5.user_id = lt6.user_id
                       AND lt5.event_time < lt6.event_time
                     WHERE lt1.user_id = lt5.user_id
                       AND lt6.event_time < lt2.event_time
                       AND lt5.event_time > lt1.event_time
                       AND (lt6.event_time - lt5.event_time) > 3 UNITS HOUR
                       AND NOT EXISTS -- an event in between these two
                           (SELECT *
                              FROM Large_Table AS lt9
                             WHERE lt5.user_id = lt9.user_id
                               AND lt9.event_time > lt5.event_time
                               AND lt9.event_time < lt6.event_time
                           )
                   )
               AND EXISTS -- an event close enough after the start
                   (SELECT *
                      FROM Large_Table AS lt7
                     WHERE lt1.user_id = lt7.user_id
                       AND lt1.event_time < lt7.event_time
                       AND lt7.event_time < lt1.event_time + 3 UNITS HOUR
                       AND lt7.event_time < lt2.event_time
                   )
               AND EXISTS -- an event close enough before the end
                   (SELECT *
                      FROM Large_Table AS lt8
                     WHERE lt2.user_id = lt8.user_id
                       AND lt2.event_time > lt8.event_time
                       AND lt8.event_time > lt2.event_time - 3 UNITS HOUR
                       AND lt8.event_time > lt1.event_time
                   )
           ) AS L
        ON S.User_ID = L.User_ID
     WHERE S.Event_Time > L.Min_Time - 3 UNITS HOUR
       AND S.Event_Time < L.Max_Time + 3 UNITS HOUR
    ORDER BY User_ID, Event_Time, Min_Time;
    

    OK-公正な​​警告; SQLは実際にはSQLDBMSの近くにはありませんでした。

    コードがテストされました。微小なチャンスは実際にはゼロでした。構文エラーがあり、解決すべきマイナーな問題がいくつかありました。

    テストデータを工夫して段階的に実験しました。クエリの検証と修正中に「アルファ」データ(以下を参照)を使用し、異なるUser_ID値の間にクロストークがないことを確認するためにのみベータデータを追加しました。

    明示的な<を使用しました および> BETWEEN ... ANDではなく操作 エンドポイントを除外します。正確に3時間離れたイベントを「十分に近い」と見なす場合は、各不等式を確認する必要があります。場合によっては、イベントをBETWEEN ... ANDに変更します。 または、>=を使用することもできます または<= 必要に応じて。

    回答があります (a)私が書いたものと(b)上記の複雑な処理に関するいくつかの有用な考えを提供した(特に、「前にイベントがないが十分に近い」および「後でイベントがないが十分に近い」基準) 。「十分に近い」基準は、この質問を最も確実に複雑にします。

    テストデータ

    大きなテーブル

    CREATE TABLE Large_Table
    (
        Event_Time  DATETIME YEAR TO MINUTE NOT NULL,
        User_ID     CHAR(15) NOT NULL,
        Other_Data  INTEGER NOT NULL,
        PRIMARY KEY(User_ID, Event_Time)
    );
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 09:15', 'Alpha',  1) { R4 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 11:15', 'Alpha',  2) { R4 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 13:15', 'Alpha',  3) { R4 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 15:15', 'Alpha',  4) { R4 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 12:17', 'Beta',   1) { R4 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 09:15', 'Alpha',  5) { R1 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:17', 'Beta',   2) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 09:15', 'Alpha',  6) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 11:15', 'Alpha',  7) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 10:17', 'Beta',   3) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 09:15', 'Alpha',  8) { R3 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 11:15', 'Alpha',  9) { R3 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 13:15', 'Alpha', 10) { R3 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 10:17', 'Beta',   4) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 09:15', 'Alpha', 11) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 11:15', 'Alpha', 12) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 10:17', 'Beta',   5) { R1 };
    { Probe here }
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 15:15', 'Alpha', 13) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 17:15', 'Alpha', 14) { R2 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 16:17', 'Beta',   6) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 09:15', 'Alpha', 15) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 11:15', 'Alpha', 16) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 13:15', 'Alpha', 17) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 15:15', 'Alpha', 18) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 17:15', 'Alpha', 19) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 19:15', 'Alpha', 20) { R6 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 16:17', 'Beta',   7) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 09:15', 'Alpha', 21) { R1 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 11:17', 'Beta',   8) { R1 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 12:15', 'Alpha', 22) { R1 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 13:17', 'Beta',   9) { R1 };
    
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 09:15', 'Alpha', 23) { R5 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 11:15', 'Alpha', 24) { R5 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 13:15', 'Alpha', 25) { R5 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 15:15', 'Alpha', 26) { R5 };
    INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 17:15', 'Alpha', 27) { R5 };
    

    小さなテーブル

    注:テストの目的で、小さいテーブルには実際には大きいテーブルよりも多くの行が含まれています。 Other_Data値が100より大きい小さなテーブルの行は、結果に表示されないはずです(表示されません)。ここでのテストは、エッジ条件を突くものです。

    CREATE TABLE Small_Table
    (
        Event_Time  DATETIME YEAR TO MINUTE NOT NULL,
        User_ID     CHAR(15) NOT NULL,
        Other_Data  INTEGER NOT NULL,
        PRIMARY KEY(User_ID, Event_Time)
    );
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 06:15', 'Alpha', 131) { XX };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 06:20', 'Alpha',  31) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 10:20', 'Alpha',  32) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 13:20', 'Alpha',  33) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 15:20', 'Alpha',  34) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 18:15', 'Alpha', 134) { XX };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 06:15', 'Alpha', 135) { XX };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 06:16', 'Alpha',  35) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:20', 'Alpha',  35) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 12:14', 'Alpha',  35) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 12:15', 'Alpha', 135) { XX };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 09:20', 'Alpha',  36) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 11:20', 'Alpha',  37) { YY };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 09:20', 'Alpha',  38) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 11:20', 'Alpha',  39) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 13:20', 'Alpha',  40) { YY };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 09:20', 'Alpha',  41) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 11:20', 'Alpha',  42) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 13:20', 'Alpha',  42) { 22 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 15:20', 'Alpha',  43) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 17:20', 'Alpha',  44) { YY };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 09:20', 'Alpha',  45) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 11:20', 'Alpha',  46) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 13:20', 'Alpha',  47) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 15:20', 'Alpha',  48) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 17:20', 'Alpha',  49) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 19:20', 'Alpha',  50) { YY };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 09:20', 'Alpha',  51) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 10:20', 'Alpha',  51) { 22 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 12:20', 'Alpha',  52) { YY };
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 09:20', 'Alpha',  53) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 11:20', 'Alpha',  54) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 13:20', 'Alpha',  55) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 15:20', 'Alpha',  56) { YY };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 17:20', 'Alpha',  57) { YY };
    
    
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 13:27', 'Beta',   9) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 11:27', 'Beta',   8) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 16:27', 'Beta',   7) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 16:27', 'Beta',   6) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 10:27', 'Beta',   5) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 10:27', 'Beta',   4) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 10:27', 'Beta',   3) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:27', 'Beta',   2) { R1 };
    INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 12:27', 'Beta',   1) { R4 };
    

    最終的なクエリ結果

    上記のデータを使用して、得られた結果は次のとおりです。

    Alpha   2012-01-01 06:20   2012-01-01 09:15   2012-01-01 15:15   31
    Alpha   2012-01-01 10:20   2012-01-01 09:15   2012-01-01 15:15   32
    Alpha   2012-01-01 13:20   2012-01-01 09:15   2012-01-01 15:15   33
    Alpha   2012-01-01 15:20   2012-01-01 09:15   2012-01-01 15:15   34
    Alpha   2012-01-02 06:16   2012-01-02 09:15   2012-01-02 09:15   35
    Alpha   2012-01-02 10:20   2012-01-02 09:15   2012-01-02 09:15   35
    Alpha   2012-01-02 12:14   2012-01-02 09:15   2012-01-02 09:15   35
    Alpha   2012-01-03 09:20   2012-01-03 09:15   2012-01-03 11:15   36
    Alpha   2012-01-03 11:20   2012-01-03 09:15   2012-01-03 11:15   37
    Alpha   2012-01-04 09:20   2012-01-04 09:15   2012-01-04 13:15   38
    Alpha   2012-01-04 11:20   2012-01-04 09:15   2012-01-04 13:15   39
    Alpha   2012-01-04 13:20   2012-01-04 09:15   2012-01-04 13:15   40
    Alpha   2012-01-05 09:20   2012-01-05 09:15   2012-01-05 11:15   41
    Alpha   2012-01-05 11:20   2012-01-05 09:15   2012-01-05 11:15   42
    Alpha   2012-01-05 13:20   2012-01-05 09:15   2012-01-05 11:15   42
    Alpha   2012-01-05 13:20   2012-01-05 15:15   2012-01-05 17:15   42
    Alpha   2012-01-05 15:20   2012-01-05 15:15   2012-01-05 17:15   43
    Alpha   2012-01-05 17:20   2012-01-05 15:15   2012-01-05 17:15   44
    Alpha   2012-01-06 09:20   2012-01-06 09:15   2012-01-06 19:15   45
    Alpha   2012-01-06 11:20   2012-01-06 09:15   2012-01-06 19:15   46
    Alpha   2012-01-06 13:20   2012-01-06 09:15   2012-01-06 19:15   47
    Alpha   2012-01-06 15:20   2012-01-06 09:15   2012-01-06 19:15   48
    Alpha   2012-01-06 17:20   2012-01-06 09:15   2012-01-06 19:15   49
    Alpha   2012-01-06 19:20   2012-01-06 09:15   2012-01-06 19:15   50
    Alpha   2012-01-07 09:20   2012-01-07 09:15   2012-01-07 09:15   51
    Alpha   2012-01-07 09:20   2012-01-07 12:15   2012-01-07 12:15   51
    Alpha   2012-01-07 10:20   2012-01-07 09:15   2012-01-07 09:15   51
    Alpha   2012-01-07 10:20   2012-01-07 12:15   2012-01-07 12:15   51
    Alpha   2012-01-07 12:20   2012-01-07 12:15   2012-01-07 12:15   52
    Alpha   2012-01-08 09:20   2012-01-08 09:15   2012-01-08 17:15   53
    Alpha   2012-01-08 11:20   2012-01-08 09:15   2012-01-08 17:15   54
    Alpha   2012-01-08 13:20   2012-01-08 09:15   2012-01-08 17:15   55
    Alpha   2012-01-08 15:20   2012-01-08 09:15   2012-01-08 17:15   56
    Alpha   2012-01-08 17:20   2012-01-08 09:15   2012-01-08 17:15   57
    Beta    2012-01-01 12:27   2012-01-01 12:17   2012-01-01 12:17    1
    Beta    2012-01-02 10:27   2012-01-02 10:17   2012-01-02 10:17    2
    Beta    2012-01-03 10:27   2012-01-03 10:17   2012-01-03 10:17    3
    Beta    2012-01-04 10:27   2012-01-04 10:17   2012-01-04 10:17    4
    Beta    2012-01-05 10:27   2012-01-05 10:17   2012-01-05 10:17    5
    Beta    2012-01-05 16:27   2012-01-05 16:17   2012-01-05 16:17    6
    Beta    2012-01-06 16:27   2012-01-06 16:17   2012-01-06 16:17    7
    Beta    2012-01-07 11:27   2012-01-07 11:17   2012-01-07 13:17    8
    Beta    2012-01-07 13:27   2012-01-07 11:17   2012-01-07 13:17    9
    

    中間結果

    わずかに異なるフォーマットが有効です。

    シングルトン範囲

    Alpha|2012-01-02 09:15|2012-01-02 09:15
    Alpha|2012-01-07 09:15|2012-01-07 09:15
    Alpha|2012-01-07 12:15|2012-01-07 12:15
    Beta|2012-01-01 12:17|2012-01-01 12:17
    Beta|2012-01-02 10:17|2012-01-02 10:17
    Beta|2012-01-03 10:17|2012-01-03 10:17
    Beta|2012-01-04 10:17|2012-01-04 10:17
    Beta|2012-01-05 10:17|2012-01-05 10:17
    Beta|2012-01-05 16:17|2012-01-05 16:17
    Beta|2012-01-06 16:17|2012-01-06 16:17
    

    ダブルトンレンジ

    Alpha|2012-01-03 09:15|2012-01-03 11:15
    Alpha|2012-01-05 09:15|2012-01-05 11:15
    Alpha|2012-01-05 15:15|2012-01-05 17:15
    Beta|2012-01-07 11:17|2012-01-07 13:17
    

    複数のイベント範囲

    Alpha|2012-01-01 09:15|2012-01-01 15:15
    Alpha|2012-01-04 09:15|2012-01-04 13:15
    Alpha|2012-01-06 09:15|2012-01-06 19:15
    Alpha|2012-01-08 09:15|2012-01-08 17:15
    


    1. mysqlストアドプロシージャのネストされたループ

    2. MySQLでの文字列の連結

    3. テキスト列を一意のキーにする

    4. 原因:android.database.sqlite.SQLiteException:そのようなテーブルはありません:(コード1)Android