我很难将这些Oracle代码转换为Spark SQL。
SELECT STUDY_ID, POSITION_ID, STATUS
FROM
(SELECT t2.STUDY_ID, t2.POSITION_ID
, (SELECT MAX(
t1.CODE || '~' || DATE || '~' || COMMENT)
KEEP (
DENSE_RANK LAST
ORDER BY
t1.DATE
,
CASE
WHEN t1.CODE IN ('READY TO BEGIN') THEN 1
WHEN t1.CODE IN ('IN PROGRESS') THEN 2
WHEN t1.CODE IN ('FINISHED') THEN 3
ELSE 10
END
)
FROM TABLE1 t1
WHERE t2.POSITION_ID = t1.POSITION_ID
AND t1.CODE IS NOT NULL
) STATUS
FROM TABLE2 t2,
TABLE3 t3
WHERE t2.STUDY_ID = t3.STUDY_ID
)
WHERE STATUS IS NOT NULL
到目前为止,我已经尝试将CASE WHEN之前的部分替换为PARTITION BY,ORDERED BY t1.DATE DESC,因为DENSE_RANK指定LAST。我还尝试了不同的窗口函数,它们产生的结果与基本查询不同。我对SQL世界相当陌生,我发现这种转换真的很令人困惑。我试图向AI寻求帮助,但它不太明白这个查询试图实现什么。结果应该是:多个POSITION_ID用于多个STUDY_ID,每个STUDY_ID具有其最新的STATUS,例如:
| 研究ID|位置_ID|地位|
| --|--|--|
| 123 | 1111 |准备开始~01.01.2000~开始|
| 123 | 1112 |完成日期:2000年1月2日|
1条答案
按热度按时间quhf5bfb1#
您可以将Oracle查询重写为:
我不使用Apache Spark,但Spark SQL似乎支持
CASE
表达式和ROW_NUMBER
分析函数,因此您可以使用该查询(或者您可能还需要将code || '~' || date || '~' || comment
转换为CONCAT(code, '~', date, '~', comment)
)。status
永远不会是NULL
,因为它包含'~'
字面值,而这永远不会是NULL
。