Oracle:根据不同列的值选择不同的列

Posted

技术标签:

【中文标题】Oracle:根据不同列的值选择不同的列【英文标题】:Oracle: Select a distinct column based on the value of a different column 【发布时间】:2021-06-24 14:11:59 【问题描述】:

这是当前表格的样子。

item description date
12-001 SIM CARD 04/06/2021
12-001 SIM CARD-1 04/07/2021

我想从上表中获取最新的不同项目。我试图获取的记录将如下所示,因为该记录的日期是最新的。

item description date
12-001 SIM CARD-1 04/07/2021

我正在使用 Oracle。以下是我的查询。任何帮助表示赞赏。

SELECT DISTINCT item , description, date FROM items

【问题讨论】:

当一场足球比赛以 3-3 结束时,这称为“平局”。当您谈论“第一个”、“最后一个”等时,联系总是很重要的。对于同一项目的“最新日期”,两种不同的描述是否可以“联系”?还是输入数据中的一对(项目,日期)是唯一的?如果你没有这样独特的约束,你必须总是考虑关系。在您的示例中,如果 两行 行中的日期为 2021 年 4 月 7 日(并且同一项目的其他行具有更早的日期,并带有各种描述),那么期望的结果是什么?跨度> 【参考方案1】:

您可以使用ROW_NUMBER() 来识别您想要的行。

例如:

select item, description, date
from (
  select i.*,
    row_number() over(partition by item order by date desc) as rn
  from items i
) x
where rn = 1

在这种情况下,只有每个项目的最后一行的行号为 1。

【讨论】:

【参考方案2】:

由于您的描述列有不同的数据,因此 DISTINCT 关键字在这里不起作用。您可以尝试使用窗口函数进行以下查询 -

SELECT item , description, date
  FROM (SELECT item, description, date, ROW_NUMBER() OVER(PARTITION BY item ORDER BY date DESC) RN
          FROM items)
 WHERE RN = 1;

【讨论】:

【参考方案3】:

在 Oracle 的最新(12.x 及更高版本)版本中,您可以使用以下内容:

SELECT *
  FROM ITEMS
  ORDER BY "date" DESC
  FETCH FIRST 1 ROWS ONLY

请注意,"date" 在此查询中被引用,因为 date 在 Oracle 中不是有效的标识符,除非被引用,因为它也是数据类型的名称、ANSI 日期说明符,可能还有一些其他的东西我已经忘记了。

db<>fiddle here

【讨论】:

以上是关于Oracle:根据不同列的值选择不同的列的主要内容,如果未能解决你的问题,请参考以下文章

选择不同的和非不同的列值

如何从 Oracle Apex 的不同列属性页面中引用列的值?

在 Access 中有多个列的查询中选择单个不同的列

Oracle PL/SQL - 根据条件对不同列进行选择、分组、排序、where-clause 的最佳方法?

如果存在于列表中,则根据另一列的值选择列

根据另一列的值选择列