我想要最多多列

问题描述

要求是我需要的 从 A 到 I 列的 ID、日期和最大值。 A、B、C、D、E、F、G 列的 MAX 值,我需要 sql 服务器或 Synapse 查询

enter image description here

已经试过了

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)