我编写了一个简单的查询,返回一个人的最后两个出勤记录,以下是一个示例:
Id Date
305351 1/24/2018
305351 1/23/2018
E5671 10/12/2014
E5671 10/11/2014
查询:
----Retrieve days from date difference - Starts
SELECT T1.EMPNO,
T1.ATT_DATE
FROM (
SELECT T2.EMPNO, T2.ATT_DATE,
ROW_NUMBER() OVER(PARTITION BY T2.EMPNO ORDER BY T2.ATT_DATE DESC) as rn
FROM TableName T2
) T1
WHERE T1.rn <= 2
----Retrieve days from date difference - Ends
以上情况很好,现在我正试图从日期差异中获取日期。尝试了以下操作,但从具有JOIN
的行到员工ID的两个日期之间返回不正确的天数:
TO_DATE(T1.ATT_DATE) - TO_DATE(T3.ATT_DATE) "DAYS"
预期输出:
Id Date Days
305351 1/24/2018 1
305351 1/23/2018 1
E5671 10/12/2014 1
E5671 10/11/2014 1
我猜,在这里犯了一个愚蠢的错误,希望有一个想法让它发挥作用 - 谢谢。
更新1 - 输出可能如下:
预期输出:
Id Date Days
305351 1/24/2018 1 //(24-01-2018) - (23-01-2018) = Day 1
E5671 10/12/2014 1 //(12-01-2018) - (11-01-2018) = Day 1
答案 0 :(得分:1)
您可以使用lag()
和lead()
。例如:
SELECT T1.EMPNO, T1.ATT_DATE,
(T1.ATT_DATE - T1.prev_att_date) as Days
FROM (SELECT T2.*,
LAG(T2.ATT_DATE) OVER (PARTITION BY t2.EMPNO ORDER BY t2.ATT_DATE) as prev_att_date
ROW_NUMBER() OVER (PARTITION BY T2.EMPNO ORDER BY T2.ATT_DATE DESC) as rn
FROM TableName T2
) T1
WHERE T1.rn <= 2;
这会将日期放在每行的上一个记录中,因此值不一定相同。您的问题不清楚每行的值是否应该相同,或者数字是否应该是之前的值。