如何使用SQL从每个组中只获得一个结果

时间:2012-09-13 10:33:07

标签: mysql sql unique distinct

我真的不知道如何对此任务进行查询。

我需要为表格中每条记录的第一行获取时间,但每当我有一组相同的结果时,我需要在第一行出现时和信号等于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 个答案:

答案 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;

示例:SQLFiddle

答案 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
)