我有一个表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度量标准是按日期为广告活动计算的。
我想要得到这样的要求的结果:
预期结果:
CAMPAINID | KPIID | KPIVALUE
----------+---------+---------
P-201 | Metric1 | 12.25
P-201 | Metric2 | 10.15
P-225 | Metric1 | 15.05
P-225 | Metric2 | 25.00
您能帮助进行正确的SQL查询吗?
答案 0 :(得分:0)
此代码针对CALCDATE
和CAMPAINID
的每种情况获取包含最大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;
答案 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