选择具有相同值的上次更新的行

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 子句。

以上是关于选择具有相同值的上次更新的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 选择两列中具有相同值的行

根据另一列的字段值选择具有相同列值的行

如何从两个表中选择同一字段中具有相同值的行?

从具有不同值的行中选择所有值

mysql返回最大n个具有相同值的行

在保留列的同时计算具有相同值的行