我的任务是准备从运行控制页面生成的报告,并检索当前月薪和上月薪。在该页面中,用户将选择他们想要的cal_id
,例如,在这种情况下,用户选择cal id
= FEB
。假设下表名为table_salary
:
emplid | cal_id | salary | pymt_date
101 | JAN | 10000 | 2018-01-01
101 | FEB | 15000 | 2018-02-01
我的预期输出是
emplid | cur_sal| prev_sal
101 | 15000 | 10000
到目前为止,我所做的如下所示
SELECT
A.EMPLID, A.SALARY AS CUR_SAL, B.SALARY AS PREV_SAL
FROM
TABLE_SALARY A
LEFT OUTER JOIN
TABLE_SALARY B ON A.EMPLID AND B.EMPLID
AND A.CAL_ID = B.CAL_ID
AND B.PYMT_DT = (SELECT MAX(B1.PYMT_DT)
FROM TABLE_SALARY B1
WHERE B1.EMPLID = B.EMPLID
AND B1.PYMT_DT >= DATEADD(mm, DATEDIFF(mm, 0, B.PYMT_DT) - 1, 0)
AND B1.PYMT_DT < DATEADD(mm, DATEDIFF(mm, 0, PYMT_DT), 0))
但是上面的SQL没有返回预期的输出。
有人知道如何实现我的预期输出吗?
答案 0 :(得分:1)
使用窗口函数检索排序集中的上一行。我认为应该可以。
SELECT TOP 1
EMPLID, SALARY AS CUR_SAL, LEAD(SALARY, 1, 0) OVER (ORDER BY PYMT_DT DESC) AS PREV_SAL
FROM
TABLE_SALARY
ORDER BY
PYMT_DT DESC
答案 1 :(得分:1)
应该是这样 使用Lead代替Lag
spark = SparkSession.builder.config(conf=conf).getOrCreate()