我真的不知道如何对此任务进行查询。
我需要为表格中每条记录的第一行获取时间,但每当我有一组相同的结果时,我需要在第一行出现时和信号等于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
答案 0 :(得分: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 Fiddle 强>
答案 1 :(得分: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;
答案 2 :(得分:0)
我会开始尝试像
这样的东西SELECT * FROM tablename where Signal=1 GROUP BY Time ORDER BY Time ASC
答案 3 :(得分:0)
SELECT * FROM your_table
WHERE id IN (
SELECT MIN(id) FROM your_table
WHERE Signal != 0
GROUP BY Serial
)