mysql根据条件限制比较中的行数

mysql根据条件限制比较中的行数,mysql,sql,Mysql,Sql,我有一个表,我的表有两列 1. Timestamp (ts) 2. Value (val) 我需要为每个时间戳返回在时间戳上或之前出现的10个最新值的平均值 我可以对以下查询执行类似的操作: SELECT t2.ts as time, AVG(t1.val) as avg_val FROM table_name as t1, table_name as t2 WHERE t1.ts <= t2.ts 这将返回一个时间戳以及在该时间戳上或之前发生的所有值的平均值

我有一个表,我的表有两列

 1. Timestamp (ts)
 2. Value (val)
我需要为每个时间戳返回在时间戳上或之前出现的10个最新值的平均值

我可以对以下查询执行类似的操作:

SELECT t2.ts as time, 
       AVG(t1.val) as avg_val 
FROM table_name as t1, table_name as t2 
WHERE t1.ts <= t2.ts 
这将返回一个时间戳以及在该时间戳上或之前发生的所有值的平均值。我需要修改此查询以返回10个最新值的平均值,而不是所有值的平均值


PS:为一个糟糕的问题标题道歉。我不知道怎么画

忽略前面的答案。您可以使用“穷人排名”对按时间戳排序的行进行排名。您可以自行加入结果以查找每个列组的前9行:

SELECT a.ts, AVG(c.val)
FROM (
    SELECT t1.ts, COUNT(t2.ts) AS rank
    FROM t AS t1
    INNER JOIN t AS t2 ON t2.ts <= t1.ts
    GROUP BY t1.ts
) AS a
INNER JOIN (
    SELECT t1.ts, COUNT(t2.ts) AS rank
    FROM t AS t1
    INNER JOIN t AS t2 ON t2.ts <= t1.ts
    GROUP BY t1.ts
) AS b ON b.rank BETWEEN a.rank - 9 AND a.rank
INNER JOIN t AS c ON b.ts = c.ts
GROUP BY a.ts

我知道这有点笨拙,但在某些条件下,它可能比相关子查询更好。

忽略前面的答案。您可以使用“穷人排名”对按时间戳排序的行进行排名。您可以自行加入结果以查找每个列组的前9行:

SELECT a.ts, AVG(c.val)
FROM (
    SELECT t1.ts, COUNT(t2.ts) AS rank
    FROM t AS t1
    INNER JOIN t AS t2 ON t2.ts <= t1.ts
    GROUP BY t1.ts
) AS a
INNER JOIN (
    SELECT t1.ts, COUNT(t2.ts) AS rank
    FROM t AS t1
    INNER JOIN t AS t2 ON t2.ts <= t1.ts
    GROUP BY t1.ts
) AS b ON b.rank BETWEEN a.rank - 9 AND a.rank
INNER JOIN t AS c ON b.ts = c.ts
GROUP BY a.ts

我知道这有点笨拙,但在某些条件下,它可能比相关子查询更好。

在版本8之前的MySQL中,即使使用变量,也没有一种简单的方法来表达此查询。我不打算担保性能,但这应该满足您的要求:

SELECT t1.ts, t1.val, AVG(t2.val)
FROM t t1 LEFT JOIN
     t t2
     ON t2.ts <= t.ts AND
        t2.ts >= (SELECT t3.ts
                  FROM t t3
                  WHERE t3.ts <= t1.ts
                  ORDER BY t3.ts DESC
                  LIMIT 9, 1
                 )
GROUP BY t1.ts, t1.val;

在版本8之前的MySQL中,即使使用变量,也没有一种简单的方法来表达这个查询。我不打算担保性能,但这应该满足您的要求:

SELECT t1.ts, t1.val, AVG(t2.val)
FROM t t1 LEFT JOIN
     t t2
     ON t2.ts <= t.ts AND
        t2.ts >= (SELECT t3.ts
                  FROM t t3
                  WHERE t3.ts <= t1.ts
                  ORDER BY t3.ts DESC
                  LIMIT 9, 1
                 )
GROUP BY t1.ts, t1.val;

1.请停止使用基于逗号的联接。使用更明确的基于联接的语法。2.这是一个具有框架的窗口函数问题。您的MySQL服务器版本是什么?MySQL版本是5.6.35。据我所知,您需要一个横向表表达式,MySQL不支持这些。你能详细说明一下横向表表达式吗?@TheImpler是什么意思横向SQL我想他是指一个SQL关键字,它使内部SQL中的外部SQL列可以与子查询或联接一起使用,或者使用更少的方式。。基本上,它可以在MySQL中通过一个相互关联的子查询进行模拟。请停止使用基于逗号的联接。使用更明确的基于联接的语法。2.这是一个具有框架的窗口函数问题。您的MySQL服务器版本是什么?MySQL版本是5.6.35。据我所知,您需要一个横向表表达式,MySQL不支持这些。你能详细说明一下横向表表达式吗?@TheImpler是什么意思横向SQL我想他是指一个SQL关键字,它使内部SQL中的外部SQL列可以与子查询或联接一起使用,或者使用更少的方式。。基本上,它可以在MySQL中通过一个相关联的子查询进行模拟,但这不起作用。平均值是在极限值之前计算的。这不起作用。平均值是在限制之前计算出来的。这几乎有效,只是它跳过了前9行。@SalmanA。当前面没有10个值时,不清楚OP想要什么,但是OP想要这些行是合理的。左连接修复了这个问题。除了跳过前9行外,这几乎可以正常工作。@SalmanA。当前面没有10个值时,不清楚OP想要什么,但是OP想要这些行是合理的。左连接修复了这个问题。