sql db2 - 滚动30天的最大日期和第二最大日期
我当前的声明从当前价格的人口数与表中找到的最大或最近日期相关联的表中提取价格。记录的最后价格是来自表中第二个最大日期的价格。sql db2 - 滚动30天的最大日期和第二最大日期
我该如何创建一个语句,它会在过去的日期中拖动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
预期输出1纪录滚动30天:
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
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,这样你的初始价格日期为11/17/2016,但这取决于你。
至于限制为30天滚动如何实现,取决于你的意思。
如果您需要过去30天内的任何价格,请在公用表格中添加一个where条件,该条件查找DT_PRICE>当前日期 - 30天。
然而,如果你想在过去的30条价格记录,而不管日期则刚好翻转ROW_NUMBER是在降序和选择前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
嗨@Matt,你发布的第一个声明效果很好!谢谢!我应该在哪里输入要返回的DT_PRICE日期范围或最大行数?我试着在CTE的末尾输入一个AND语句,并说:AND fpr.DT_PIRCE> = '11/23/2016',例如为了得到几天的价值 - 我注意到了一件事情 - 如果一个记录是新的,没有LAST_PRICE_DATE和LAST_PRICE,它不会出现在输出中。是否有快速解决方案来包含LAST_PRICE_DATE和LAST_PRICE有NULLS的记录? – steveW
@steveW欢迎您。感谢您接受不要忘记注册。至于在哪里输入取决于你想要的最大行数或最小日期,例如, 30条记录,然后使用限制记录的第二条语句。如果你想要最近30天,然后输入cte和DT_PRICE,我编辑它使它更清晰。希望你一切都安定下来。欢呼声 – Matt
只是另一件事 - 你建议追加一个子查询或调整和声明到OR帐户的最后日期和价格是空的记录?该查询当前排除具有NULL最后日期和价格的任何记录。 – steveW
对不起不明白你的逻辑。同时向我们展示示例数据以获取该输出。请阅读[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的放置到[** START **](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)以了解如何改善您的质量问题并获得更好的答案。 –