我有下表和随机数据:
+--+-----+
|id|data | // + Any other Constant rows
+--+-----+
|1 |P | // 1. of id1
+--+-----+
|1 |Q | // 2. of id1
+--+-----+
|2 |R | // 1. of id2
+--+-----+
|3 |S | // 1. of id3
+--+-----+
|3 |a | // 2. of id3
+--+-----+
|3 |C | // 3. of id3
+--+-----+
让我们说,我需要每个id的每个SECOND条目。
结果应为:
+--+-----+
|id|data | // + Any other Constant rows
+--+-----+
|1 |Q | // 2. of id1
+--+-----+
|3 |a | // 2. of id3 and none of id2
+--+-----+
我不知道。我知道如何获得每个id的第一个
SELECT DISTINCT id, data FROM tablename
但是这并没有解决我在第n个条目中遇到的问题。该表格简化:还存在唯一ID(如果它可以解决任何问题)
有人有答案吗?
答案 0 :(得分:1)
你可以这样做:
SELECT `id`,`data`
FROM
(SELECT t1.id, t1.data, count(*) as row_number
FROM TableName t1
JOIN TableName t2 ON t1.id = t2.id AND t1.data >= t2.data
GROUP BY t1.id, t1.data) as temptable
WHERE row_number=2
<强>解释强>
row_number
列是按id
列分区的记录的序号。
如果执行内部查询,则会产生如下结果:
id row_number
--------------------
1 1
1 2
2 1
3 1
3 2
3 3
使用外部查询,我们选择row_number=2
的记录。
重要:强>
您应该使用其他唯一列(正如您在问题下方的评论中提到的那样)而不是data
。因为,它是根据data
列的顺序进行分区的。
修改强>
此处条件t1.id = t2.id AND t1.data >= t2.data
用于根据t2.data
按内容排序。然后,我们根据row_number
订单和id
分区等条件创建列data
。
答案 1 :(得分:1)
我刚试过这个并且它有效。这可能会更高效,因为它不使用连接,但只读取表中的记录
set @row_num:=0;
set @lastid:=0;
Select id, data from
(select id, data, if(id<>@lastid, @row_num:=1, @row_num:=@row_num+1) as row_number, @lastid:=id from tablename order by id) temptab
where row_number = 2
基本上,您正在select语句中构建行号计数器。 last_id位分区,因此每个新ID都会重新开始行号。
答案 2 :(得分:0)
免责声明:
这可能不是最佳答案。我当时只是在寻找比平时更多的解决方案,并且认为分享可能会很有趣。
以下是使用Enum.toString()
子句中的子查询来解决此问题的方法:
SELECT
它看起来很像@RagingBull的答案,而且更糟糕,因为每行都要执行子查询。