Как получить результаты, выбранные только по последней дате? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть таблица 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. KPIVALUE foreach KPIID должен быть выбран только с последним 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 голосов
/ 16 декабря 2018

Если вы хотите сделать это более длинным способом, вы можете использовать Общие табличные выражения.

;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

0 голосов
/ 16 декабря 2018

В этом случае часто используются оконные функции:

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;
0 голосов
/ 16 декабря 2018

это будет работать:

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

0 голосов
/ 16 декабря 2018

Этот код выбирает строки, которые содержат максимум 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...