2014-11-10 3 views
1

Здесь приведен пример таблица:Как получить максимум из нескольких столбцов в оракуле

|   customer_token    |  created_date   | orders | views | 
+--------------------------------------+------------------------------+--------+-------+ 
| 93a03e36-83a0-494b-bd68-495f54f406ca | 10-NOV-14 14.41.09.000000000 | 1 | 0 | 
| 93a03e36-83a0-494b-bd68-495f54f406ca | 20-NOV-14 14.41.47.000000000 | 0 | 1 | 
| 93a03e36-83a0-494b-bd68-495f54f406ca | 26-OCT-14 16.14.30.000000000 | 2 | 0 | 
| 93a03e36-83a0-494b-bd68-495f54f406ca | 11-OCT-14 16.31.11.000000000 | 0 | 2 | 

В этой таблице данных о клиентах я хранить все даты, когда данный клиент разместил заказ, или просмотрен продукт. Теперь для отчета я хочу написать запрос, где для каждого клиента (auth_token) я хочу сгенерировать last_order_date (строка, где заказы> 0) и last_view_date (строка, где product_views> 0).

Я ищу эффективный запрос, так как у меня есть миллионы записей.

ответ

2
select customer_token, 
     max(case when orders > 0 then created_date else NULL end), 
     max(case when views > 0 then created_date else NULL end) 
from Customer 
group by customer_token; 

Update: Этот запрос является достаточно эффективным, так как Oracle, вероятно, сканирование таблицы только один раз. Также есть интересная вещь с группировкой - когда вы используете GROUP BY, список выбора может содержать только столбцы, которые находятся в функциях GROUP BY или aggregate. В этом запросе MAX вычисляется для столбца created_date, но вам не нужно ставить orders и views в GROUP BY, потому что они находятся в выражении внутри функции MAX. Это не очень распространено.

+0

Я пробовал этот запрос, и он дал мне правильные результаты. большое спасибо. –

+0

@Sanjay Patil Добро пожаловать – Multisync

0

Если вы хотите получить наибольшее значение из строки, вам нужно использовать функцию агрегации MAX(). Также лучше всего группировать столбец, когда вы используете агрегированные функции.

В этом случае вы хотите сгруппировать по customer_token. Таким образом, вы получите одну строку для каждой группы, а функция aggregate даст вам значение для этой группы.

Однако, вы хотите видеть только даты, когда значение ячейки больше 0, поэтому я рекомендую вам поставить случай заявление внутри вашей функции MAX(), как это:

SELECT customer_token, 
    MAX(CASE WHEN orders > 0 THEN created_date ELSE NULL END) AS latestOrderDate, 
    MAX(CASE WHEN views > 0 THEN created_date ELSE NULL END) AS latestViewDate 
FROM customer 
GROUP BY customer_token; 

Это даст вам максимальная дата только тогда, когда ордера положительны, и только тогда, когда точки зрения положительны. Без этого случая СУБД не будет знать, какие группы вам дать, и вы, вероятно, получите неверные результаты.

Описание оракула для aggregate functions.

+1

Какова цель дать тот же ответ через 20 минут? + Вы сделали ошибку в своем запросе. Вопрос состоял в том, как сделать эффективный запрос, а не объяснять, как работает функция MAX. – Multisync

+0

@multisync Какова цель ответа на копирование и вставку, который учит OP ничего? – AdamMc331

Смежные вопросы