我在数据库中有一系列值需要提取以创建折线图。因为我不需要高分辨率,所以我想通过从数据库中选择第5行来对数据进行重新采样。
Answers:
SELECT *
FROM (
SELECT
@row := @row +1 AS rownum, [column name]
FROM (
SELECT @row :=0) r, [table name]
) ranked
WHERE rownum % [n] = 1
[n]
在查询中替换为5,以获取第5行。
@row :=0
为@row :=2
= 1
改为= 2
您可以尝试使用mod 5获得ID为5的倍数的行(假设您具有某种顺序的ID列)。
select * from table where table.id mod 5 = 0;
由于您说的是使用MySQL,因此可以使用用户变量来创建连续的行编号。但是,您必须将其放入派生表(子查询)中。
SET @x := 0;
SELECT *
FROM (SELECT (@x:=@x+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t
WHERE x MOD 5 = 0;
我添加ORDER BY RAND()
了一个伪随机采样,而不是每次都允许无序表的第五行出现在采样中。
匿名用户尝试对其进行编辑以更改x MOD 5 = 0
为x MOD 5 = 1
。我已将其改回原来的状态。
出于记录目的,在那种情况下,可以使用0到4之间的任何值,并且没有理由更喜欢一个值。
SET @a = 0;
SELECT * FROM t where (@a := @a + 1) % 2 = 0;
我一直在寻找这样的东西。泰勒和比尔的回答使我改进了他们的想法。
table data1的字段为read_date,我们要从一个受read_date范围限制的查询中选择每2d记录的值,派生表的名称是任意的,这里称为DT
查询:
SET @row := 0;
SELECT * FROM ( SELECT @row := @row +1 AS rownum, read_date, value FROM data1
WHERE read_date>= 1279771200 AND read_date <= 1281844740 ) as DT WHERE MOD(rownum,2)=0
SET @row := 0; SELECT count(distinct Message) FROM ( SELECT @row := @row +1 AS rownum, Message FROM operations.EventLog WHERE LogTime > now() - interval 6 hour and ProcedureName = 'Do_CDR' ) as DT WHERE MOD(rownum,2)=0;
您可以使用此查询,
set @n=2; <!-- nth row -->
select * from (SELECT t.*,
@rowid := @rowid + 1 AS ID
FROM TABLE t,
(SELECT @rowid := 0) dummy) A where A.ID mod @n = 0;
或者你可以替换 ň与第n个值
如果您使用的是MariaDB 10.2,MySQL 8或更高版本,则可以使用通用的表表达式和窗口函数来提高效率,并且我认为更清楚。
WITH ordering AS (
SELECT ROW_NUMBER() OVER (ORDER BY name) AS n, example.*
FROM example ORDER BY name
)
SELECT * FROM ordering WHERE MOD(n, 5) = 0;
从概念上讲,这将创建一个临时表,该表具有example
按name
字段排序的表内容,添加一个名为n
行号的附加字段,然后仅获取数字可被5整除的行,即每5行一次。实际上,数据库引擎通常能够对此进行更好的优化。但是,即使它没有进一步优化它,我认为它比迭代使用用户变量更清晰,就像在早期版本的MySQL中一样。
如果您在结果集中不需要行号,则可以简化查询。
SELECT
[column name]
FROM
(SELECT @row:=0) temp,
[table name]
WHERE (@row:=@row + 1) % [n] = 1
替换以下占位符:
[column name]
您需要提取的列列表。[table name]
表名替换。[n]
数字代替。例如,如果您需要第5行,则将其替换为5