2016-09-01 4 views
0

Я довольно новичок в SQL, и я пытаюсь обобщить таблицу, используя ее в программном обеспечении SAS.Подведение итогов в SQL

Вот таблица я должен резюме:

policy_number item 
1234    1 
1234    2 
1234    3 
567    1 
89    1 
90    1 
90    2 

Вот результат мне нужно:

policy_number  item max_item 
    1234    1  3 
    1234    2  3 
    1234    3  3 
    567    1  1 
    89    1  1 
    90    1  2 
    90    2  2 

А вот мой код:

proc sql; 
create table example 
as select 
policy_number, 
item, 
max(item) as max_item 
from table1 
group by policy_number, item; 
quit; 

И это дает этот результат:

policy_number  item max_item 
     1234    1  1 
     1234    2  1 
     1234    3  3 
     567    1  1 
     89    1  1 
     90    1  1 
     90    2  2 

Что я делаю неправильно? Может ли кто-нибудь помочь мне исправить мой код?

ответ

3

Хммм. Я бы ожидал, что это будет делать то, что вы хотите:

proc sql; 
    create table example as 
     select policy_number, item, max(item) as max_item 
     from table1 
     group by policy_number; 
quit; 

Это нестандартный SQL. Но в proc SQL он должен удалить максимум для третьего столбца.

Я хотел бы добавить, что эта версия еще один способ сделать то, что вы хотите:

proc sql; 
    create table example as 
     select t1.policy_number, t1.item, tt1.max_item 
     from table1 t1 join 
      (select policy_number, max(item) as max_item 
       from table1 
       group by policy_number 
      ) tt1 
      on t1.policy_number = tt1.policy_number; 
quit; 
1

Try думать об этом таким образом. Ваша таблица выглядит так.

policy_number  item 
1234    1 
1234    2 
1234    3 
567    1 
89    1 
90    1 
90    2 

Во-первых, цель состоит в том, чтобы найти максимальный элемент каждой политики, что может быть сделано, как так

SELECT policy_number, MAX(item) max_item 
FROM table1 
GROUP BY policy_number 

Это дает следующий результат.

policy_number  max_item 
1234    3 
567    1 
89    1 
90    2 

Следующий шаг - объединить их вместе, что вы можете сделать с помощью дополнительного запроса и соединения.

SELECT table1.policy_number, item, max_item 
FROM table1 
JOIN (
    SELECT policy_number, MAX(item) max_item 
    FROM table1 
    GROUP BY policy_number 
) SubQ ON SubQ.policy_number = table1.policy_number 
0

Вы можете сделать это, ПРИСОЕДИНИТЕСЬ к таблице к себе.

Ниже простой пример для этой цели:

SELECT I.policy_number, I.item, J.mx FROM example I 
LEFT JOIN 
(SELECT 
     policy_number, max(item) AS mx 
FROM example 
GROUP BY policy_number) J 
ON J.policy_number=I.policy_number 

Но в зависимости от цели это может быть эффективными или неэффективными.

0

ВЫБОР t.policy_number, t.item, макс (пункт) в течение (раздел по t.policy_number) как макс

ОТ dbo.table1 т

ORDER BY t.policy_number

+0

Это это SAS SQL, который не поддерживает ключевое слово 'over'. –

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