我当前的声明从表格中提取价格,其中当前价格的人口与表格中的最大或最近日期相关联。记录的最后价格是表格中第二个最大日期的价格。
如何创建一个语句,其中包含过去30天的过去日期,其中最后一个日期始终是找到的前一天?
SELECT
T1.ID
T1.DT_PRICE
T1.PRICE
T2.LAST_DT_PRICE,
T2.LAST_PRICE
FROM
(SELECT
fpr.ID,
fpr.DT_PRICE,
fpr.PRICE
FROM UDBADM.PRICES fpr
WHERE fpr.DT_PRICE = (select max(DT_PRICE)
from UDBADM.PRICES)
AND fpr.CD_PRICE = 'C'
) T1
LEFT JOIN
(SELECT
fpr2.ID,
fpr2.DT_PRICE AS LAST_DT_PRICE,
fpr2.PRICE AS LAST_PRICE
FROM UDBADM.PRICES fpr2
WHERE fpr2.DT_PRCE = (select max(DT_PRICE)
from UDBADM.PRICES
where DT_PRICE < (select
max(DT_PRICE)
from UDBADM.PRICES))
AND fpr2.CD_PRICE = 'C'
) T2
ON T1.ID = T2.ID
1条记录的当前输出:
ID DT_PRICE PRICE LAST_DT_PRICE LAST_PRICE
B5199 11/30/2016 50.3 11/29/2016 50.1
滚动30天的1条记录的预期输出:
ID DT_PRICE PRICE LAST_DT_PRICE LAST_PRICE
B5199 10/18/2016 50.1 10/17/2016 50
B5199 10/19/2016 50 10/18/2016 50.1
B5199 10/20/2016 49.75 10/19/2016 50
B5199 10/21/2016 49.8 10/20/2016 49.75
B5199 10/24/2016 50.12 10/21/2016 49.8
B5199 10/25/2016 50.2 10/24/2016 50.12
B5199 10/26/2016 50.25 10/25/2016 50.2
B5199 10/27/2016 50.1 10/26/2016 50.25
B5199 10/28/2016 49.8 10/27/2016 50.1
B5199 10/31/2016 49.5 10/28/2016 49.8
B5199 11/1/2016 49.2 10/31/2016 49.5
B5199 11/2/2016 50 11/1/2016 49.2
B5199 11/3/2016 50.1 11/2/2016 50
B5199 11/4/2016 50 11/3/2016 50.1
B5199 11/7/2016 49.75 11/4/2016 50
B5199 11/8/2016 49.8 11/7/2016 49.75
B5199 11/9/2016 50 11/8/2016 49.8
B5199 11/10/2016 50 11/9/2016 50
B5199 11/14/2016 50.1 11/10/2016 50
B5199 11/15/2016 50.1 11/14/2016 50.1
B5199 11/16/2016 49.8 11/15/2016 50.1
B5199 11/17/2016 49.5 11/16/2016 49.8
B5199 11/18/2016 49.2 11/17/2016 49.5
B5199 11/21/2016 48.9 11/18/2016 49.2
B5199 11/22/2016 49.8 11/21/2016 48.9
B5199 11/23/2016 50.2 11/22/2016 49.8
B5199 11/25/2016 50.2 11/23/2016 50.2
B5199 11/28/2016 50.2 11/25/2016 50.2
B5199 11/29/2016 50.1 11/28/2016 50.2
B5199 11/30/2016 50.3 11/29/2016 50.1
答案 0 :(得分:0)
WITH cte AS (
SELECT
fpr.Id
,fpr.DT_PRICE
,fpr.PRICE
,ROW_NUMBER() OVER (PARTITION BY fpr.Id ORDER BY fpr.DT_PRICE) as IdRowNumber
FROM
UDBADM.PRICES fpr
WHERE
fpr.CE_PRICE = 'C'
AND fpr.DT_PIRCE >= '10/23/2016'
)
SELECT
c1.Id
,c1.DT_PRICE
,c1.PRICE
,c2.DT_PRICE as LAST_PRICE_DATE
,c2.PRICE as LAST_PRICE
FROM
cte c1
INNER JOIN cte c2
ON c1.Id = c2.Id
AND c1.IdRowNumber = c2.IdRowNumber + 1
由于您的日期有差距,您可以根据日期生成row_number,然后使用自联接中的行号来获取之前的价格。请注意,INNER JOIN会为您提供准确的输出,但您可能需要考虑LEFT JOIN,以便您的初始价格日期为2016年11月17日,但这取决于您。
至于限制滚动30天如何实现这取决于你的意思。
如果您想要过去30天内的任何价格,那么在公用表表达式中添加where条件,该表达式查找DT_PRICE&gt;当前日期 - 30天。
如果您想要最后30个价格记录而不考虑日期,那么只需将row_number翻转为DESCENDING并选择前30个记录,如下所示:
WITH cte AS (
SELECT
fpr.Id
,fpr.DT_PRICE
,fpr.PRICE
,ROW_NUMBER() OVER (PARTITION BY fpr.Id ORDER BY fpr.DT_PRICE DESC) as IdRowNumber
FROM
UDBADM.PRICES fpr
WHERE
fpr.CE_PRICE = 'C'
)
SELECT
c1.Id
,c1.DT_PRICE
,c1.PRICE
,c2.DT_PRICE as LAST_PRICE_DATE
,c2.PRICE as LAST_PRICE
FROM
cte c1
INNER JOIN cte c2
ON c1.Id = c2.Id
AND c1.IdRowNumber = c2.IdRowNumber - 1
WHERE
c1.IdRowNumber <= 30