Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以获取最大月数的值之和_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 查询以获取最大月数的值之和

Sql 查询以获取最大月数的值之和,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,Oracle 11中的此查询获取过去1年的值之和,当有1年的数据时,此查询有效 当数据少于1年时,此查询返回0,而不是最早年份之前的值之和 例如,如果只有6个月的数据,则查询应返回到第6个月的值的总和 SELECT SUM (DECODE (rnk, 11, rt, 0)) 1Y FROM (SELECT entity_id,rnk, SUM (ABS(NVL (value, 0))) OVER (PARTITION BY TRIM (entity_id) ORDER

Oracle 11中的此查询获取过去1年的值之和,当有1年的数据时,此查询有效

当数据少于1年时,此查询返回0,而不是最早年份之前的值之和

例如,如果只有6个月的数据,则查询应返回到第6个月的值的总和

SELECT SUM (DECODE (rnk, 11, rt, 0)) 1Y
FROM (SELECT entity_id,rnk,
             SUM (ABS(NVL (value, 0))) OVER (PARTITION BY TRIM (entity_id) ORDER BY rnk) rt
      FROM (SELECT psm.*,RANK () OVER (PARTITION BY entity_id ORDER BY period_end_date DESC) AS rnk
            FROM myTable psm
            WHERE psm.entity_id = '1'
            ORDER BY period_end_date DESC
           ) rank_tab
      WHERE rnk < 12
      );
在上面的示例中,1Y应该返回1+2+3+4+5+6=21。 相反,我的查询返回0,因为它正在查找rnk=11,它不存在

SUM (DECODE (rnk, 11, rt, 0)) 1Y
多谢各位

SELECT 
CASE WHEN MRank < 11 then maxY else OneY end as lc_incearned_1Y
FROM (
WITH R as
(SELECT MAX(RNK) MaxRank FROM (
SELECT RANK () OVER (PARTITION BY TRIM (entity_id) ORDER BY period_end_date 
DESC) AS rnk FROM myTbl psm
WHERE TRIM (psm.entity_id) = '1' AND period_end_date < 
to_date('9/30/2019','MM/DD/YYYY')
ORDER BY period_end_date DESC))
select MAX(MaxRank) MRank,
SUM (DECODE (rnk, MaxRank, rt, 0)) maxY,
SUM (DECODE (rnk, 11, rt, 0)) OneY,  --13051.97
FROM (SELECT entity_id,rnk,
SUM (ABS (NVL (value, 0))) OVER (PARTITION BY TRIM (entity_id) ORDER BY rnk) rt
FROM (SELECT psm.*,RANK () OVER (PARTITION BY TRIM (entity_id) ORDER BY period_end_date DESC) AS rnk FROM CREF.PORTFOLIO_SUMM_MTHEND psm
WHERE TRIM (psm.entity_id) = '1' AND period_end_date < to_date('9/30/2019','MM/DD/YYYY')
ORDER BY period_end_date DESC) rank_tab WHERE rnk < 12) T,R)
编辑:

这很有效。但是,如果你知道更好的方法,请告诉我。多谢各位

SELECT 
CASE WHEN MRank < 11 then maxY else OneY end as lc_incearned_1Y
FROM (
WITH R as
(SELECT MAX(RNK) MaxRank FROM (
SELECT RANK () OVER (PARTITION BY TRIM (entity_id) ORDER BY period_end_date 
DESC) AS rnk FROM myTbl psm
WHERE TRIM (psm.entity_id) = '1' AND period_end_date < 
to_date('9/30/2019','MM/DD/YYYY')
ORDER BY period_end_date DESC))
select MAX(MaxRank) MRank,
SUM (DECODE (rnk, MaxRank, rt, 0)) maxY,
SUM (DECODE (rnk, 11, rt, 0)) OneY,  --13051.97
FROM (SELECT entity_id,rnk,
SUM (ABS (NVL (value, 0))) OVER (PARTITION BY TRIM (entity_id) ORDER BY rnk) rt
FROM (SELECT psm.*,RANK () OVER (PARTITION BY TRIM (entity_id) ORDER BY period_end_date DESC) AS rnk FROM CREF.PORTFOLIO_SUMM_MTHEND psm
WHERE TRIM (psm.entity_id) = '1' AND period_end_date < to_date('9/30/2019','MM/DD/YYYY')
ORDER BY period_end_date DESC) rank_tab WHERE rnk < 12) T,R)

似乎您需要将您的值从最近一段时间的结束日期加起来,直到十一个月范围内的最早日期。最好使用maxperiod\u end\u date over partition by entity\u id order by period\u end\u date desc分析函数以及当前秩函数。然后应用介于、期间、结束和日期之间的月份。如果您需要从当前日期开始查找,则去掉max分析函数,并在函数之间的月份用truncsysdate替换。因此,请使用:

with t as
(
select max(period_end_date) over (partition by entity_id order by period_end_date desc) as mx,
       rank() over (partition by entity_id order by period_end_date desc) as rnk,
       t.*
  from myTable t
)
select sum(nvl(value,0)) as sum_value
  from t
 where months_between(mx,period_end_date)<=11

样本数据和期望结果以及对逻辑的清晰解释都会有所帮助。我已经添加了样本数据和期望结果。@faujong,您只需要当前日期的最后11个月数据还是最后11行数据?您是否只是尝试了一个简单的求和而没有秩子查询?您可以将id和日期约束放在WHERE子句中。我需要过去11个月数据的总和。
with t as
(
select max(period_end_date) over (partition by entity_id order by period_end_date desc) as mx,
       rank() over (partition by entity_id order by period_end_date desc) as rnk,
       t.*
  from myTable t
)
select sum(nvl(value,0)) as sum_value
  from t
 where months_between(mx,period_end_date)<=11