Аналитические функции SQL первое значение больше max (еще один атрибут) - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблица month_totals, которая выглядит следующим образом:

Name      DateFrom       Total                      
a         2017-01-01     34      
b         2017-01-01     54           
a         2017-02-01     22             
b         2017-02-01     12
a         2017-03-01     34      
b         2017-03-01     54 

Как выбрать последний Totals за Name where DateFrom < '2017-03-01' (возможно, с использованием аналитических функций)

Следующее утверждение не работает должным образом

 SELECT name,
       First_value(total)
         OVER (
           ORDER BY Max(datefrom) DESC)
FROM   month_totals
WHERE datefrom < '2017-03-01'
GROUP  BY NAME  

Желаемый результат должен быть

Name           Total                               
a              22             
b              12

Ответы [ 2 ]

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

Хотя вы можете использовать оконные функции, я думаю, что коррелированный подзапрос - достаточно простой способ написания запроса и должен иметь хорошую производительность;

select mt.*
from month_totals mt
where mt.datefrom = (select max(mt2.datefrom)
                     from month_totals mt2
                     where mt2.name = mt.name and mt2.datefrom < '2017-03-01'
                    );
0 голосов
/ 20 декабря 2018

Вы можете попробовать ниже, используя минимальное агрегирование

 SELECT name,min(total) 
    FROM   month_totals
   GROUP  BY NAME 

ИЛИ вы можете использовать row_number ()

select * from
(
SELECT name,
       row_number() over(partition by name order by total)rn
FROM   month_totals
WHERE datefrom < '2017-03-01'
)A where rn=1
...