在SQL中总结

时间:2016-09-01 02:03:46

标签: sql sas proc-sql

我对SQL很陌生,我试图在SAS软件上使用它来汇总一个表。

以下是我要总结的表格:

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

我做错了什么?有人可以帮我修改我的代码吗?

4 个答案:

答案 0 :(得分: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 :(得分:1)

试着这样想。你的桌子看起来像这样。

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

答案 2 :(得分: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

但根据目的,这可能是有效的或无效的。

答案 3 :(得分:0)

SELECT t.policy_number,t.item,max(item)over(partition by t.policy_number) 最大

FROM dbo.table1 t

ORDER BY t.policy_number