[英]Oracle/SQL Find Date or Closest date to specified date
I am trying to run a query within oracle which creates a value. 我正在尝试在创建值的oracle中运行查询。 The underlying table does not always contain a match for a specific date.
基础表并不总是包含特定日期的匹配项。 So i have to either find the record with the date specified or find the closest date below the specified date.
因此,我必须找到具有指定日期的记录,或者找到指定日期以下的最接近日期。
SUM(CASE
WHEN S.VAL_SECURITY NOT IN ('GBP')
AND E.SECURITY_ID NOT IN ('GBP')
THEN (
(((amount) * - 1) / nvl(s.minor_per_unit, 1)) * (
SELECT EXCHANGE_RATE
FROM ISET.PREVIOUS_PRICES
WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
)
) * (
SELECT EXCHANGE_RATE
FROM ISET.PREVIOUS_PRICES
WHERE SECURITY_ID = S.VAL_SECURITY
AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
)
WHEN S.VAL_SECURITY IN ('GBP')
AND E.SECURITY_ID NOT IN ('GBP')
THEN (
(((amount) * - 1) / nvl(s.minor_per_unit, 1)) * (
SELECT EXCHANGE_RATE
FROM ISET.PREVIOUS_PRICES
WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
)
)
ELSE ((amount) * - 1) / nvl(s.minor_per_unit, 1)
END) GBP_VALUE
The code in question is 有问题的代码是
E.SECURITY_ID AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
So assuming it doesn't find a record for the specified date then it needs to find the max date record closest to but below the specified date. 因此,假设它找不到指定日期的记录,则需要找到最接近但低于指定日期的最大日期记录。
Any help would be greatly appreciated. 任何帮助将不胜感激。
Thank you 谢谢
I think you are looking for top 1 in this select : 我认为您正在此选择中寻找前1名:
SELECT EXCHANGE_RATE
FROM ISET.PREVIOUS_PRICES
WHERE ROWNUM = 1
AND ISET.PREVIOUS_PRICES.SECURITY_ID=E.SECURITY_ID
AND VAL_DATE <= TO_DATE('05/08/2019', 'DD/MM/YYYY')
ORDER BY VAL_DATE DESC
Try this edited , with ROWNUM = 1 in the where condition 尝试编辑此内容,在where条件下使用ROWNUM = 1
Could you try this? 你可以试试这个吗? I haven't verified it.
我还没有验证。
val_date =
(SELECT val_date
FROM (SELECT MAX (b.val_date) val_date,
MIN (TO_DATE ('05/08/2019', 'DD/MM/YYYY') - b.val_date)
diff
FROM PREVIOUS_PRICES b
WHERE SECURITY_ID = E.SECURITY_ID
AND status_date <= TO_DATE ('05/08/2019', 'DD/MM/YYYY')
UNION ALL
SELECT MIN (val_date),
MIN (b.val_date - TO_DATE ('05/08/2019', 'DD/MM/YYYY'))
FROM PREVIOUS_PRICES b
WHERE SECURITY_ID = E.SECURITY_ID
AND status_date > TO_DATE ('05/08/2019', 'DD/MM/YYYY')
ORDER BY 2)
WHERE ROWNUM = 1)
Use one more embedded SQL Level 再使用一个嵌入式SQL级别
SELECT EXCHANGE_RATE
FROM ISET.PREVIOUS_PRICES
WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
AND VAL_DATE = (
SELECT MAX(val_date)
FROM iset.previous_prices
WHERE val_date <= TO_DATE ( '05/08/2019', 'DD/MM/YYYY' )
and PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.