问题描述
要求是我需要的 从 A 到 I 列的 ID、日期和最大值。 A、B、C、D、E、F、G 列的 MAX 值,我需要 sql 服务器或 Synapse 查询
已经试过了
select max(A) from (values( A,B,C,D,E,F,G,I)) as A) as Z
这适用于 sql 但不适用于 Azure 突触
解决方法
如果我理解正确,您可以使用apply
:
select t.*,v.max_val
from t cross apply
(select max(v.col) as max_val
from (values (a),(b),. . .) v(col)
) v;
,
Azure Synapse Analytics 中的无服务器 SQL 池(以前称为按需 SQL)支持 GREATEST
,因此这种类型的查询在无服务器中很容易,例如
SELECT id,dt,GREATEST ( a,b,c,d,e,f,g,h,i ) x
FROM yourTable
对于专用 SQL 池,您可以使用 UNPIVOT
来达到相同的效果:
SELECT id,MAX(x) x
FROM yourTable
UNPIVOT ( x for y In ( a,i ) ) AS upvt
GROUP BY id,dt
GREATEST
可能在某些时候添加到专用 SQL 池中,因此可能值得时不时检查一下。
由于 SparkSQL 支持 GREATEST
,您可以做的另一件事是使用 Azure Synapse 笔记本从专用 SQL 池中快速拉取数据,对其进行处理并将其弹出,例如作为批处理的一部分。这是一个使用 Scala 笔记本的简单示例。
单元格 1:
// Get the table from the dedicated SQL pool into a dataframe
val df = spark.read.synapsesql("someSQLPool.dbo.greatestWorking")
// Save the dataframe as a temp view to make it available to SparkSQL
df.createOrReplaceTempView("greatestWorking")
单元格 2:
// Write the result to a new data frame to be saved back into the dedicated SQL pool
val result = spark.sql("SELECT id,i ) AS x FROM greatestWorking")
result.write.synapsesql("someSQLPool.dbo.result",Constants.INTERNAL)