选择mysql中每个ID的第二行

时间:2013-02-02 11:08:36

标签: mysql sql select group-by

我有一张桌子:

ID | time
1 | 300
1 | 100
1 | 200
2 | 200
2 | 500

我想为2nd row每个ID提供1st row 我知道我可以select ID,time from T group by ID; 作为

limit

但我不知道如何为每个ID获得第二行 我知道offset中的mysqlEDIT : Actually, time is not ordered. I forgot to specify that. I have made an edit in the table. 条款,但无法弄清楚如何在这里使用它们。
我该怎么办?

{{1}}

4 个答案:

答案 0 :(得分:2)

我只是想知道怎么做但我无法解决它,也许你可以解决它。感谢任何建议更正我的查询

首先选择每个id的第一行。

                  SELECT min(id) id 
                 FROM TableName t2
                 group by id

然后选择min {id)not in第一个查询选择min(id)(第二行)

像那样

      SELECT  min(id) id ,time
      FROM TableName 
      WHERE id NOT IN    (
                          SELECT min(id) id 
                          FROM TableName 
                          GROUP BY id
                         )
      GROUP BY id
**正如我刚才所说的那样。它返回0值。如果你修复它,让我编辑我的帖子是有帮助的

here a demo

答案 1 :(得分:1)

SELECT ID, MAX(time) time
FROM
    (
        select ID, Time
        from    TableName a
        where 
        (
            select count(*) 
            from TableName as f
            where f.ID = a.ID and f.time <= a.time
        ) <= 2
    ) s
GROUP BY ID

答案 2 :(得分:0)

SELECT x.* 
  FROM test x 
  JOIN test y 
    ON y.id = x.id 
   AND y.time >= x.time
 GROUP 
    BY id,time 
HAVING COUNT(*) = n;

请注意,任何少于n个结果的条目都将被省略

答案 3 :(得分:0)

您不能使用您拥有的表格执行此操作。你可以用:

进行勇敢的尝试
select id, time
from (select id, time
      from t
      group by t
     ) t
where not exists (select 1 from t t2 where t2.id = t.id and t2.time = t.time)
group by id

即尝试过滤掉第一行。

这是不可能的原因是因为表本质上是无序的,所以表中没有“second”的真正定义。这使SQL引擎有机会在处理过程中重新排列行,这可以带来很大的性能提升。

即使是你正在使用的构造:

select id, time
from t
group by id

不保证从第一行返回时间。这是MySQL的一个(错误)功能,叫做Hidden Columns。它实际上仅适用于所有值相同的情况。我承认在实践中它似乎从第一行获得了值,但你无法保证。

可能您最好的解决方案是将数据选择到具有自动递增列的新表中:

create table newtable (
    autoid int auto_increment,
    id int,
    time int
);

insert into newtable(id, time)
    select id, time from t;

实际上,这可能与原始表保持相同的顺序,然后您可以使用autoid来获取第二行。不过,我想强调“在实践中”。无法保证值的顺序正确,但它们可能是正确的。