如何在不使用Sub Query,CTE和Prodedure的情况下实现此目的

时间:2015-09-26 14:31:57

标签: sql apache-spark apache-spark-sql

我有一个包含2个字段的表

CREATE TABLE Temp_tab 
(
     id int identity primary key, 
     value float
);

INSERT INTO Temp_tab(value)
VALUES (65.09),(17.09);

我想选择所有大于平均值(值)的记录。

说... Select * from temp_tab where value > (select avg(value) from temp_tab); 上面的查询(使用子查询)给出了预期的输出

1   65.09

我想在不使用Sub Query,CTE和Prodedure的情况下实现这一点,因为我使用的是Spark DB。 Spark Db不支持子查询,CTE和Prodedures

2 个答案:

答案 0 :(得分:3)

使用cross join和聚合:

可以非常痛苦地完成这项工作
Select t1.id, t1.value
from temp_tab t1 cross join
     temp_tab t2
group by t1.id, t1.value
having t1.value > avg(t2.value);

作为注释:Spark SQL声称支持子查询(请参阅here)。因此,您的原始查询应该有效。如果它只支持from子句中的子查询,那么你可以这样做:

Select t.*
from temp_tab t join
     (select avg(value) as avgvalue from temp_tab) a
     on t.value > a.avgvalue;

答案 1 :(得分:0)

spark-sql在1.6.x版本下接受此查询

select * from (select * from tenmin_history order by TS_TIME DESC limit 144) a order by TS_TIME

此查询解决了我的问题。