有什么方法可以在Presto中执行FOR LOOP吗?

时间:2019-12-15 10:22:38

标签: sql presto

编辑以澄清我的问题

数据库:Presto,我使用我公司的工具进行查询,但是它基本上类似于MySQL或其他东西。

目的是:我有训练班,我想通过比较训练日前后的一些指标(例如W + 1,W + 2等与训练前)来对它们进行评估。经过几个子查询后,我可以使用以下值实现表(每个类都有其自己的度量标准,并且是唯一的)。

类|指标| shopid |培训前| w + 1 | w + 2 | w + 3

A | ……增加1122 | x | x1 | x2 | x3

B |减少…… 3322 | y | y1 | y2 | y3等

所以现在我想将W + 1,W + 2的值与预训练进行比较以得出结论,例如:如果x1> x->好,如果x2 坏,等等。 / p>

所以我写了一个CASE WHEN语句

CASE metric = 'increase sth'
     WHEN x1 > x THEN 'good'
     WHEN x1 < x THEN 'bad' 
CASE metric = 'decrease sth' 
....

要应用到w + 1,w + 2等列上,以获得所需的结果,但是由于我必须为4列编写CASE语句,所以这将非常冗长,效率低下且重复,因此我考虑到LOOP,因此我只需要编写一次CASE语句,它就可以不重复地应用于所有4列。

我本可以提取数据并在Python中执行此操作,但我想学习如何在SQL中执行此操作,这样在完成查询后不必做额外的工作。

对不起,我对SQL还是很陌生(仅两个月左右,仍在努力工作,以丰富我的知识)

希望您能提供帮助。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的问题很模糊,但是您可以使用class SomeController { private $client; public function __construct(YourHttpClient $client) { $this->client = $client; } } 将行分开并只进行一次计算。这倾向于将值放在单独的行中:

lateral join

您还可以将这些值放回一行。

也就是说,您在使用关系数据库方面似乎没有良好的基础。问题始于您的初始结构,即您将值跨列存储,而不是将存储在单独的行中。

SQL没有“循环”,因为它是基于集合的。而且它是基于集合的,因此优化程序可以找出运行查询的最佳方法。