如何获取仅在最后日期之前选择的结果?

时间:2018-12-16 10:24:03

标签: sql db2

我有一个表KPI

KPIID   | CAMPAINID | CALCDATE   | KPIVALUE
--------+-----------+------------+---------
Metric1 | P-201     | 2018-12-04 | 10.00   
Metric1 | P-201     | 2018-12-05 | 11.50   
Metric1 | P-201     | 2018-12-06 | 12.25   
Metric2 | P-201     | 2018-12-04 | 10.15   
Metric1 | P-225     | 2018-12-04 | 13.75   
Metric1 | P-225     | 2018-12-07 | 15.05   
Metric2 | P-225     | 2018-12-04 | 20.00   
Metric2 | P-225     | 2018-12-07 | 25.00   

KPI度量标准是按日期为广告活动计算的。

我想要得到这样的要求的结果:

  1. 由CAMPAINID和KPIID排序的表;
  2. 每个KPIID的KPIVALUE只能与最后一个CALCDATE一起选择。

预期结果:

CAMPAINID | KPIID   | KPIVALUE
----------+---------+---------
P-201     | Metric1 |  12.25  
P-201     | Metric2 |  10.15  
P-225     | Metric1 |  15.05  
P-225     | Metric2 |  25.00   

您能帮助进行正确的SQL查询吗?

4 个答案:

答案 0 :(得分:0)

此代码针对CALCDATECAMPAINID的每种情况获取包含最大KPIID的行:

    SELECT 
      CAMPAINID, KPIID, KPIVALUE 
    FROM KPI k 
    WHERE 
      CALCDATE = (
        SELECT MAX(CALCDATE) FROM KPI WHERE CAMPAINID = k.CAMPAINID AND  KPIID = k.KPIID
      )
    ORDER BY CAMPAINID, KPIID

答案 1 :(得分:0)

在这种情况下,经常会使用窗口功能:

select campaignId, kpiid, kpivalue
from (select kpi.*,
             max(kpi.calcdate) over (partition by kpi.campaignId, kpi.kpiid) as max_calcdate
      from kpi
     ) k
where calcdate = max_calcdate;

答案 2 :(得分:0)

这将起作用:

select * from (select k.*,rank() over(partition by k.KPIID,k.CAMPAINID order by 
k.CALCDATE  desc)rank from KPI k)  where rank =1;

看到它: http://sqlfiddle.com/#!4/1ca92/6/0

答案 3 :(得分:0)

如果您想用更长的时间来做,可以使用Common表表达式。

;WITH MaxDatesCTE AS
(
  SELECT KPIID, 
         CAMPAINID,
         MAX(CALCDATE) AS MaxDate
  FROM KPI
  GROUP BY KPIID, CAMPAINID
)
SELECT K.CAMPAINID,
       K.KPIID,
       K.KPIVALUE
FROM MaxDatesCTE MC
  INNER JOIN KPI K ON MC.KPIID = K.KPIID
                   AND K.CAMPAINID = MC.CAMPAINID
                   AND K.CALCDATE = MC.MaxDate
ORDER BY K.CAMPAINID, K.KPIID ASC

链接:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=9bf6b00481820b5924ed7e5b9f8309b9