【问题标题】:sql - delete rows which are less than a value using rank and groupbysql - 使用 rank 和 groupby 删除小于某个值的行
【发布时间】:2019-05-20 11:08:10
【问题描述】:

在表格中我有流程和运行

对于每个流程,我必须保留最大运行次数的行,删除剩余的所有内容。这必须对所有流进行。

使用单个语句。

我尝试使用 cte,排名但出现错误。

我尝试按流进行分组,然后为该组应用排名,然后删除 > 1 的行。


WITH cte AS 

( SELECT flow, RANK() OVER 

       (PARTITION BY flow ORDER BY runs) 

AS rank FROM TEST_RESULTS_TABLE GROUP BY flow )

DELETE FROM cte WHERE rank >1 ;


this is giving :

ORA-00928: missing SELECT keyword
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:
Error at Line: 25 Column: 153

【问题讨论】:

    标签: sql oracle12c rank


    【解决方案1】:

    Oracle 不支持可更新的 CTE。相反,您可以这样做:

    delete from test_results_table trt
        where runs > (select min(trt2.runs)
                      from test_results_table trt2
                      where trt2.flow = trt.flow
                     )
    

    【讨论】:

      【解决方案2】:

      您可以使用RANK() 查询(不带GROUP BY)并使用ROWID 伪列将其与DELETE 语句相关联:

      DELETE FROM test_results_table
      WHERE ROWID IN (
        SELECT ROWID
        FROM   (
          SELECT RANK() OVER ( PARTITION BY flow ORDER BY runs ASC ) AS rnk
          FROM   test_results_table
        )
        WHERE rnk > 1
      )
      

      db小提琴here

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        相关资源
        最近更新 更多