【发布时间】:2015-10-13 16:50:15
【问题描述】:
我无法让它工作。我正在查询 S 表以获取项目列表,并希望加入 P 表以提取与 S + 前一个日期相同的日期的数据,只要可能使用了 LEAD 函数。
问题是 P 表很大,除非给出特定日期或小范围,否则查询需要很长时间。由于我是按日期加入标准普尔的,因此 LEAD 似乎无法提取前一个日期的数据。
还有其他选择吗?前面的 P.TDATE 通常只是之前的营业日期,但有时可能是一年多以前。
SELECT S.ID,
S.EDATE,
S.PDATE,
S.FACTOR,
S.PTYPE,
P.TDATE,
P.PRICE,
P.PTYPE,
LEAD(P.TDATE) OVER (PARTITION BY P.ID
ORDER BY P.TDATE DESC) AS PRIOR_DATE,
LEAD(P.PRICE) OVER (PARTITION BY P.ID
ORDER BY P.TDATE DESC) AS PRIOR_PRICE,
LEAD(P.PTYPE) OVER (PARTITION BY P.ID
ORDER BY P.TDATE DESC) AS PRIOR_PTYPE
FROM S
LEFT JOIN P ON P.ID = S.ID
AND P.TDATE = S.EDATE
WHERE S.PERIOD = 'D'
AND S.PTYPE IN ('A',
'G',
'Q',
'Y')
ORDER BY S.EDATE ;
我得到了所有正确的数据,除了prior_date、prior_price 和prior_ptype 在它们不应该的时候都是空白的。
日期字段中没有 NULL 值。
是否有另一种基于 S.EDATE 查询 P 表的有效方法,而不是在左连接中使用 P.TDATE = S.EDATE?我相信这种情况是由于 LEAD 函数没有其他数据可查看而导致“先前”列上没有显示任何内容的原因。
谢谢,
【问题讨论】:
-
这是错字吗:
ORDER BY S.EDATE,那个逗号? -
是的。我删除了它。
-
因为您是按日期按 desc 顺序排序的,所以 NULL 值将是第一个。如果你在函数中包含 NULL LAST 规则,我认为你会得到你想要的结果..
LEAD(P.TDATE) OVER (PARTITION BY P.ID ORDER BY P.TDATE DESC NULLS LAST) AS PRIOR_DATE,... -
顺便说一句,
LEAD... ORDER BY ... DESC与LAG... ORDER BY ... ASC相同 -
任何表中都没有空日期值。因此,按 P.TDATE DESC 排序应该给出前一个日期行。