Oracle 11g使用一个脚本选择/插入多个最大值

时间:2013-12-11 17:16:06

标签: sql oracle11g

我在使用一个脚本选择/插入多个最大值时遇到问题。下表用于表示值与我尝试使用的表的组合。

脚本需要是一个insert语句,用于将返回的值插入第二个表中。

CREATE TABLE family
( state      VARCHAR2(2 BYTE),
  Birth            date,
  Married       date,
  Shirt size        number(10 )
  Shoe size       number(10),
  Hair                  VARCHAR2(80 BYTE),
  carname                VARCHAR2(24 BYTE),
  CATname               VARCHAR2(24 BYTE),
  Hometown                    VARCHAR2(40 BYTE),
  Alive             CHAR(1 BYTE),
  job_CATEGORY_1        VARCHAR2(40 BYTE),
  job_CATEGORY_2        VARCHAR2(40 BYTE)
)

此表有超过1500行。我需要从记录中选择所有值 “最早的出生日期,最早的结婚日期,最大的鞋子尺码和最大的衬衫尺寸”的组合。其余值必须在脚本中。

当我选择出生日期最长的人时,我会得到三条记录,其中包含各种结婚日期,各种衬衫和鞋码。我需要选择max(出生),max(已婚),max(衬衫尺码)和max(鞋码)的组合,然后包括剩下的列。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用analytic functions执行此操作:

select * from
(
  select f.*,
    rank() over (partition by state
      order by birth) as birth_rank,
    rank() over (partition by state, birth
      order by married) as married_rank,
    rank() over (partition by state, birth, married
      order by shoe_size desc) as shoe_rank,
    rank() over (partition by state, birth, married, shoe_size
      order by shirt_size desc) as shirt_rank
  from family f
)
where birth_rank = 1
and married_rank = 1
and shoe_rank = 1
and shirt_rank = 1;

但是在外部查询中不是select *,而只选择您感兴趣的字段 - 您可能不希望看到排名字段。

每个_rank psuedocolumn是ranking匹配列中的值与前面的组之间的值。所以对于birth_rank,它只是查看状态,并且在每个状态中将有一个或多个记录被排名为1.对于married_rank它正在向下看,因此在每个状态组合中出生日期将有一个结婚日期,排名为1.依此类推。外部查询然后只选择最高等级,并且通常每个状态只有一个记录。 (Rank允许联系,因此如果两个或多个记录符合所有条件,您可能需要一种方法来打破关系。)

出生和结婚等级按升序排序,因此最早的数据排在第一位;该节目和衬衫尺码排名下降到最大排名第一。

SQL Fiddle demo,显示分配给第一个查询中所有行的所有值的排名,然后在第二个查询中应用过滤器,因此只有一行(每个州,但我只包括一)。这就是样本数据有用的原因。