2017-02-19 17 views
1

Учитывая таблицу нижеПолучение максимального post_year группы по электронной почте с NUM лет

Email Post_Year country 
====== ========== ======= 
[email protected] 2006  US 
[email protected] 2007  US 
[email protected] 2008  HK1 
[email protected] 2008  HK 
[email protected] 2009  CN 
[email protected] 2010  SW 

Я хочу иметь

  1. все столбцы с группой макс Post_year по электронной почте, если Есть несколько макс Post_year , просто выберите один

  2. , а также num_of_yrs, который является max (post_year) -min (post_year) данного электронного письма.

Email Post_Year country Num_Of_Yrs 
====== ========== ======= ============= 
[email protected] 2008  HK  2 [which is 2008-2006] 
[email protected] 2010  SW  1 [which is 2010-2009] 

Как достичь цели?

ответ

0

Отредактировано: С отредактированном намерением, вы могли бы просто использовать:

SELECT 
    email, 
    MAX(post_year) post_year, 
    MAX(country) country, 
    MAX(post_year) - MIN(post_year) num_of_yrs 
FROM 
    table_name 
GROUP BY 
    email; 

Вы могли бы использовать это:

WITH tmp AS 
(
    SELECT 
     email, 
     MAX(post_year) max_post_year, 
     MIN(post_year) min_post_year 
    FROM 
     table_name 
    GROUP BY 
     email 
) 
SELECT 
    t.email, 
    t.post_year, 
    t.country, 
    tmp.max_post_year - tmp.min_post_year num_of_yrs 
FROM 
    table_name t 
INNER JOIN 
    tmp 
ON t.email = tmp.email 
    AND t.post_year = tmp.max_post_year; 
+0

спасибо, но есть возможность многократного макс после года, и в этом случае я бы выбрал один случайно, я изменил вопрос, чтобы отразить это, что мы должны сделать в Это дело? – sweetyBaby

+0

@sweetyBaby с несколькими max post_year, какую страну вы хотите в своем результирующем наборе? –

+0

случайно выберите один – sweetyBaby

0

Вы можете использовать функцию окна row_number, чтобы получить одну строку с максимальным года на электронную почту и функции окна max и min, чтобы получить максимальную разницу для каждого письма.

Попробуйте это:

select * 
from (
    select t.*, 
     row_number() over (partition by email 
          order by post_year desc) rn, 
     max(post_year) over (partition by email) - 
     min(post_year) over (partition by email) num_of_yrs 
    from your_table t 
    ) t where rn = 1;