Sql - чтобы получить максимальное значение из набора результатов в Oracle SQL - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь получить максимальные значения для продуктов из набора результатов, но получаю только одну строку значений.Я хочу отобразить максимальное значение для каждого продукта из набора результатов.

Пожалуйста, найдите набор результатов:

|Col1     |col2        |col3|    col4 |sum_cnt|
+---------+------------+---------+----------+-------+
|     1003|     2018/03| PC |    Prod1| 105984| 
|     1003|     2018/03| PC |    Prod2|      3| 
|     1003|     2018/03| PC |    Prod3|    695| 
|     1003|     2018/03| PC |    Prod4|   8489| 
|     1003|     2018/02| PC |    Prod1| 101894| 
|     1003|     2018/02| PC |    Prod4|   7758| 
|     1003|     2018/02| PC |    Prod3|    780| 
|     1003|     2018/02| PC |    Prod2|      1| 
|     1003|     2018/01| PC |    Prod4|   7665| 
|     1003|     2018/01| PC |    Prod3|    708| 
|     1003|     2018/01| PC |    Prod2|      5| 
|     1003|     2018/01| PC |    Prod1| 104557| 
|     1003|     2017/12| PC |    Prod2|      2| 
|     1003|     2017/12| PC |    Prod1| 106896| 
|     1003|     2017/12| PC |    Prod3|    857| 
|     1003|     2017/12| PC |    Prod4|   8177| 
|     1003|     2017/11| PC |    Prod2|      1| 
|     1003|     2017/11| PC |    Prod1| 102664| 
|     1003|     2017/11| PC |    Prod3|    724| 
|     1003|     2017/11| PC |    Prod4|   7661| 
+---------+------------+---------+----------+-------+

Я хочу отобразить Max sum_cnt для каждого продукта на последнюю дату.

Я хочу, чтобы мой вывод был:

|Col1     |col2        |col3|    col4 |sum_cnt|
+---------+------------+---------+----------+-------+
|     1003|     2018/03| PC |    Prod1| 106896| 
|     1003|     2018/03| PC |    Prod2|      5| 
|     1003|     2018/03| PC |    Prod3|    857| 
|     1003|     2018/03| PC |    Prod4|   8489| 

Я пробовал ниже запрос, чтобы получить данные, но я получаю только одну запись.

Вот код:

select * from tab2 a where sum_cnt = (select max(sum_cnt)  from tab2 b where a.col1= b.col1)

Пожалуйста, помогите мне, как этого добиться.

Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Рассмотрим присоединение к агрегированному подзапросу:

select t.col1, t.col2, t.col3, t.col4, agg.max_cnt
from tab2 t
inner join
    (
      select sub_t.col1, sub_t.col4, max(sub_t.col2) AS max_date, 
                                     max(sub_t.sum_cnt) as max_cnt
      from tab2 sub_t
      group by sub_t.col1, sub_t.col4
    ) agg
on t.col1 = agg.col1 and t.col4 = agg.col4 and t.col2 = agg.max_date
order by t.col4

Или с помощью CTE:

WITH agg AS 
    (
      select sub_t.col1, sub_t.col4, max(sub_t.col2) AS max_date,  
                                     max(sub_t.sum_cnt) as max_cnt
      from tab2 sub_t
      group by sub_t.col1, sub_t.col4    
    )

select t.col1, t.col2, t.col3, t.col4, agg.max_cnt 
from tab2 t
inner join agg
on t.col1 = agg.col1 and t.col4 = agg.col4 and t.col2 = agg.max_date
order by t.col4

Rextester Demo

0 голосов
/ 06 октября 2018

Мы можем попытаться использовать ROW_NUMBER здесь:

SELECT Col1, col2, col3, col4, sum_cnt
FROM
(
    SELECT t.*,
        ROW_NUMBER() OVER (PARTITION BY col1, col4 ORDER BY col2 DESC, sum_cnt DESC) rn
    FROM yourTable t
) t
WHERE rn = 1;

Логика здесь заключается в том, чтобы разделить по продуктам, а затем упорядочить по убыванию первой даты, чтобы получить самую последнюю дату, а затем по убыванию количества, чтобы получить наибольшее количество для этой самой последней даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...