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 的不同列属性页面中引用列的值?