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

您的确切逻辑尚不清楚,据我所知,您希望获得每行signal1 的序列值从一个时间变化到另一个的位置。

这可以使用一个变量来跟踪前一行中序列的值来完成(下面我的查询中的变量@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;

示例:SQLFiddle

于 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 回答