1

これができるかどうかはわかりませんが、できるかどうかはわかりません。

時間フィールド(簡単にするために整数を使用します)とアクティビティフィールドを持つ単純なテーブルがあるとします。データは時間どおりに並べ替えることができます。例えば:

| time  |  activity
--------------------
|  1    |  sitting
|  3    |  sitting
|  5    |  sitting
|  9    |  running
|  10   |  running
|  11   |  sitting
|  13   |  sitting
|  15   |  walking
|  18   |  walking
|  20   |  running
|  31   |  sitting
|  32   |  sitting

各アクティビティの開始/停止時間のリストを取得する簡単な方法はありますか?したがって、私の結果は次のようになります。

sitting (1, 5)
sitting (9, 10)
sitting (11, 13)
running (9, 10)
running (20, 20)
walking (15, 18)

貪欲な検索を実行し、アクティビティごとに、一意のクラスターごとに開始/停止時間を収集して、そのように保存できることを私は知っています。しかし、このデータはsqliteファイルに保存されているので、探しているのと同じデータをすばやく取得するために記述できるクエリがあると思います。データは、以下にリストしたとおりの正確な形式である必要はありませんが、同様のアクティビティのすべての発生のすべての開始/停止時間を教えてください...

4

2 に答える 2

2

SQL はセット指向の言語であるため、クエリは機能していますが、見栄えがよくありません。

SELECT activity,
       time AS start_time,
       (SELECT MAX(a3.time)
        FROM activity AS a3
        WHERE a3.time < ifnull((SELECT MIN(time)
                                FROM activity AS a4
                                WHERE a4.time > a1.time
                                  AND a4.activity != a1.activity),
                               'inf')
       ) AS end_time
FROM activity AS a1
WHERE (SELECT a2.activity
       FROM activity AS a2
       WHERE a2.time < a1.time
       ORDER BY a2.time DESC
       LIMIT 1
      ) IS NOT a1.activity

使い方:

外側のクエリ ( a1) は、グループの開始ごとにレコードを返します。レコードがアクティビティを持つ最初のレコードである場合、つまり、前のレコードに別のアクティビティがある場合、そのレコードはグループの開始です。前のレコードは、さらに小さい時間の最大のレコードであり、a2サブクエリによって計算されます。前のレコードがない場合にサブクエリが返されるため、比較ではIS NOT代わりに使用されます。!=NULL

a3サブクエリによって計算された 3 番目の列は、グループの終了時刻を示します。グループの最後のレコードは、次のグループの最初のレコードの前の最後のレコードです。次のグループの最初のレコード (a4サブクエリによって計算されます) は、タイムスタンプが最小のレコードで、さらに大きくなりますが、アクティビティは異なります。テーブルの最後には、次のグループはありません。これは、それをどの数値よりも大きい文字列にifnull変換します。NULL'inf'

于 2013-03-09T09:33:51.787 に答える
0
select a1.activity, min(a1.time), max(a2.time)
from activity as a1 
   inner join activity as a2 on a1.activity = a2.activity
group by a1.activity

パフォーマンスのヒント: アクティビティ インデックスがあることを確認してください

于 2013-03-09T08:12:48.870 に答える