【问题标题】: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。不同的版本提供不同的解决方案 - 版本越新,您可以使用的工具就越好。

标签: sql oracle analytic-functions


【解决方案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 子句。
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 2021-09-21
    • 2021-02-06
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多