1

我有一张桌子:

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;  

但我不知道如何为每个 ID 获取第二行。
我知道limitandoffset子句mysql,但不知道如何在这里使用它们。
我该怎么做 ?

EDIT : Actually, time is not ordered. I forgot to specify that. I have made an edit in the table.
4

4 回答 4

2

我只知道如何制作它,但我无法修复它,也许你可以修复它。任何建议都可以纠正我的查询

首先 this 选择每个 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 个值。如果你修复它,让我编辑我的帖子以提供帮助

这里有一个演示

于 2013-02-02T13:51:21.427 回答
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
于 2013-02-02T11:15:53.840 回答
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 个结果的条目都将被忽略

于 2013-02-02T11:15:30.410 回答
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

也就是说,尝试过滤掉第一行。

这不可能的原因是因为表本质上是无序的,因此表中没有“第二个”的真正定义。这使 SQL 引擎有机会在处理过程中按照它认为合适的方式重新排列行——这可以带来巨大的性能提升。

甚至您正在使用的构造:

select id, time
from t
group by id

不保证从第一行返回时间。这是 MySQL 的一个(错误)功能,称为隐藏列。它实际上仅适用于所有值都相同的情况。我承认在实践中它似乎从第一行获得了价值,但你不能保证这一点。

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

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

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

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

于 2013-02-02T17:59:50.467 回答