SET @rownum := -1;
SELECT
round(AVG(t.LAT_N),4)
FROM
(
SELECT
@rownum := @rownum + 1 AS rownum,
STATION.LAT_N AS LAT_N
FROM
STATION
ORDER BY STATION.LAT_N
) AS t
WHERE
t.rownum IN (
CEIL(@rownum/2),
FLOOR(@rownum/2)
)
;在上述代码中,
这就像用Python写东西一样:i= i+1
这在for循环的上下文中是有意义的,但是在上面的SQL代码中for循环在哪里( select做for循环吗?)
发布于 2018-01-09 06:05:25
此查询使用行号会话变量计算表中的中值LAT_N值。考虑一个简单的场景,其中的LAT_N值从1到10不等。然后,在分配行号(基于零)之后,我们将有以下中间表:
LAT_N | rownum
1 | 0
2 | 1
3 | 2
4 | 3
5 | 4
6 | 5
7 | 6
8 | 7
9 | 8
10 | 9在迭代内部子查询结束时,@rownum (从-1开始)的值为9。外部查询如下所示:
SELECT ROUND(AVG(t.LAT_N), 4)
FROM
(the above table) t
WHERE
t.rownum IN (CEIL(@rownum/2), FLOOR(@rownum/2));这就是LAT_N的平均值,生成的行号要么是4,要么是5。这将产生5.5的中值。请注意,对于奇数的记录,上限和下限都会产生相同的数字,并且只有一个真正的中值。
演示
发布于 2018-01-09 06:12:06
@rownum:=@rownum+1就像i = i + 1一样工作。AS rownum正在为该字段创建别名(请参见:别名语法)。您可以为任何字段或表创建别名。实际上,您的SQL语句中有两个select查询。
SELECT @rownum := @rownum + 1 AS rownum, STATION.LAT_N AS LAT_N FROM STATION ORDER BY STATION.LAT_N
这是一个所谓的子查询,其结果将被视为一个表,其中主查询将检索信息。
对于子查询,您没有给出一个WHERE子句,因此它将检索STATION表中的每一行记录。由于您将@rownum := @rownum + 1 AS rownum写入第一个结果列,因此每一行的@rownum将增加1。所以,它就像一个for循环。
在这种情况下,子查询总是在主查询之前运行。因此,在main查询的WHERE子句中,@rownum已经等于STATION表的行计数。
发布于 2018-01-09 06:04:24
是的,这个@rownum只对列值使用一个动态变量--它可以作为行索引,仅当您分配别名并在中使用子句中测试它时,或者使用子查询。
没有用于select的循环,有一个指针分配给数据中跟踪的每一行,而@rownum已经被:=操作符分配给了以前的值。
您的查询可能是这样的,条件可能是可变的,但是方法是完全的,如果您指定别名或子查询,conceptualized.You可以使用它作为行索引。
注意:在第二个条件中,如果条件为false,则不能使用@rownum,因为在最后一个条件中包含一个特定值,如果任何条件不匹配,那么它将不返回数据,但返回,如果条件为真,则可以使用它。
https://stackoverflow.com/questions/48162099
复制相似问题