【问题标题】:Oracle 11g selecting/inserting multiple max values with one scriptOracle 11g 使用一个脚本选择/插入多个最大值
【发布时间】:2013-12-29 19:27:23
【问题描述】:

我无法使用一个脚本选择/插入多个最大值。下表用于表示值与我尝试使用的表的组合。

脚本需要是一个插入语句才能将返回的值插入到第二个表中。

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(birth)、max(married)、max(shirt size) 和 max(shoe size) 的组合,然后包含其余列。

我们将不胜感激。

【问题讨论】:

  • 您是否假设一条记录(或几条)将具有所有这四列的最大值?或者您想要结婚日期最早的记录(最小,而不是最大?)三个具有最早出生日期的记录中,等等?我不确定我是否完全遵循您期望的结果。能否展示一些示例数据和预期结果?
  • 我看到了你的困惑。我添加了一个字段(州)所以我想要爱达荷州的人拥有所有合格的最大(或最小)值......每个州一个人拥有最古老(或最年轻)和最大的一切。添加数据只是一个练习。这个表只是代表我正在使用的现实,但我认为考虑每个状态的一条记录可能会有所帮助。谢谢
  • 但是最年长的人不一定结婚时间最长,或者衬衫或鞋子尺码最大 - 如果一个记录必须是所有记录中的最大值,那么大多数州在全部?
  • 感谢您的帮助...令人困惑....每个州都应该有一个记录。最年长的出生日期。如果有多个人与最早的出生日期匹配,则使用下一个字段(结婚日期)进行限定。如果有多个两个日期相同的字段,则使用下一个字段进行限定,然后如果有多个,则使用最后一个限定字段进行限定,,,然后包括所有剩余字段。

标签: sql oracle11g


【解决方案1】:

您可以使用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,它看起来更向下,所以在状态的每个组合中 和 em> 出生日期 会有一个结婚日期排名为 1。依此类推。然后,外部查询只选择最高等级,每个状态通常只有一条记录。 (排名允许平局,因此如果两条或更多记录满足所有条件,您可能需要一种打破平局的方法。

出生和已婚的排名按升序排列,所以最早的数据排在第一位;秀场和衬衫尺码排名从小到大排在第一位。

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

【讨论】:

  • 酷......谢谢......你有空括号的地方仍然是空的()?
  • @user761758 - 我添加了文档链接。对于rank 的解析版本,它始终是rank(),带空括号,是的。
猜你喜欢
  • 2020-05-28
  • 2015-08-31
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多