选择具有相同值的上次更新的行
Posted
技术标签:
【中文标题】选择具有相同值的上次更新的行【英文标题】:SELECT row of last update with same value 【发布时间】:2020-03-18 03:29:40 【问题描述】:我们有这个表,不断插入 Inrunning 字段的值,这是一个数字。有多个错误地插入。我想获取第一个插入发生重复值的行。在这种情况下,5000 值在几分钟内插入了 3 次。所以我想获取第一个插入的值,即第 3 行。
【问题讨论】:
你有什么Oracle数据库版本?不知道就跑select banner from v$version
,报完整版本号,比如11.2.0.3.0或者12.2.0.1.0。不同的版本提供不同的解决方案 - 版本越新,您可以使用的工具就越好。
【参考方案1】:
你可以在这里使用analytical
函数如下:
Select * from
(Select t.*,
Sum(case when inrunningdelay_1 = leadval then 1 end)
over (partition by writer order by wrriten_1) as sm
from
(Select t.*,
lead(inrunningdelay_1) over (partition by writer order by wrriten_1) as leadval
from your_table t) t)
Where sm = 1;
干杯!!
【讨论】:
【参考方案2】:如果您使用
Oracle DB 12c+
,那么您可以通过FETCH
子句与1 ROW ONLY
选项以及ORDER BY
子句一起使用而无需使用额外的子查询,包括LEAD()
解析函数为
LEAD(inrunningdelay_1) OVER ( PARTITION BY writer ORDER BY written_1 )
从值
zero
开始
ABS( inrunningdelay_1 - LEAD(inrunningdelay_1) OVER ( PARTITION BY writer ORDER BY written_1 ) )
通过使用差值的绝对值
SELECT t.*
FROM t
ORDER BY ABS( inrunningdelay_1 - LEAD(inrunningdelay_1)
OVER ( ORDER BY written_1 ) )
FETCH FIRST 1 ROW ONLY
Demo
更新:PARTITION BY writer
在上述情况下是多余的,因为这仅适用于 Tejash 提到的一位作家。对于多个作者,请考虑以下 Select 语句:
WITH t2 AS
(
SELECT t.*,
ABS( inrunningdelay_1 - LEAD(inrunningdelay_1)
OVER ( PARTITION BY writer ORDER BY written_1 ) ) as ld
FROM t
ORDER BY writer, ld, written_1
)
SELECT written_1, writer, inrunningdelay_1
FROM t2
ORDER BY ROW_NUMBER() OVER ( PARTITION BY writer ORDER BY ld )
FETCH FIRST 1 ROW WITH TIES
您将只过滤掉 zero
返回的值,然后选择仅第一个返回的每个作者通过ROW_NUMBER()
解析函数在最深的ORDER BY
子句中的贡献:
Demo 2
【讨论】:
这仅适用于 1 位作家。 OP 将无法为所有作者找到所有此类事件 @BarbarosÖzhan 。 . .这真的是 Oracle 12C 中的新功能吗?ORDER BY
中允许使用其他分析函数。
@GordonLinoff 你是对的,当然。我重新排列了句子的顺序以表达我的意思是 Oracle 12+ 的 FETCH
子句。以上是关于选择具有相同值的上次更新的行的主要内容,如果未能解决你的问题,请参考以下文章