我有一张桌子:
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
中的mysql
和EDIT : Actually, time is not ordered. I forgot to specify that. I have made an edit in the table.
条款,但无法弄清楚如何在这里使用它们。
我该怎么办?
{{1}}
答案 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值。如果你修复它,让我编辑我的帖子是有帮助的
答案 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来获取第二行。不过,我想强调“在实践中”。无法保证值的顺序正确,但它们可能是正确的。