3

このタスクにクエリを入れる方法が本当にわかりません。

テーブル内の各レコードの最初の行の時間を取得する必要がありますが、同じ結果のグループが発生するたびに、信号が 1 に等しいときに最初の行を取得する必要があります。

正しく説明する方法がわかりませんが、例を示します。意味がわかります。

記録:

ID| Time | Serial | Signal
 1| 10:59|   12   |   1
 2| 11:00|   12   |   1
 3| 11:01|   12   |   1
 4| 11:01|   13   |   1
 5| 11:02|   12   |   0
 6| 11:03|   12   |   0
 7| 11:05|   13   |   1
 8| 11:07|   12   |   1

だから私はこの結果が必要です:

ID| Time | Serial | Signal
 1| 10:59|   12   |   1
 4| 11:01|   13   |   1
 7| 11:05|   13   |   1
 8| 11:07|   12   |   1
4

4 に答える 4

3

signalあなたの正確な論理は明確ではありません。私が収集できることから、シリアル値が1回ごとに変化する各行を取得しようとしています。

これは、前の行のシリアルの値を追跡する変数を使用して実行できます (以下のクエリの変数 @t)。

SELECT  ID, Time, `Serial`, `Signal`
FROM    (   SELECT  ID,
                    Time,
                    `Serial`,
                    `Signal`,
                    CASE WHEN `Serial` = @t THEN 0 ELSE 1 END AS IsNew,
                    @t:= `Serial`
            FROM    T,
                    (SELECT @t:=0) t2
            ORDER BY Time
        ) t
WHERE   IsNew = 1
AND     `Signal` = 1

SQL フィドル

于 2012-09-13T10:51:33.913 に答える
1

連続したSerial値のランクを生成し、最初のランクを持つレコードのみを選択することで、この方法を実行できます。このクエリを試してください:

SELECT id, atime, serial, asignal
FROM (
      SELECT id,
             atime,
             asignal,
             IF(a.serial = @var_serial, (@var_rank:= @var_rank + 1),
                                        @var_rank := 1) AS rank,
             (@var_serial := a.serial) AS Serial
      FROM test_table a, (SELECT @var_rank := 1, @var_serial := 0) r
      ORDER BY id ASC
     )a
WHERE asignal = 1
      AND rank = 1;

例: SQLフィドル

于 2012-09-13T10:47:17.993 に答える
0

私は次のようなことを試し始めます

SELECT * FROM tablename where Signal=1  GROUP BY Time ORDER BY Time ASC
于 2012-09-13T10:39:13.420 に答える
0
SELECT * FROM your_table
WHERE id IN (
  SELECT MIN(id) FROM your_table
  WHERE Signal != 0
  GROUP BY Serial
)
于 2012-09-13T10:42:32.230 に答える