【问题标题】:Oracle 10g - Return Single Row Based On Max Value of some ColumnsOracle 10g - 根据某些列的最大值返回单行
【发布时间】:2013-12-13 08:12:42
【问题描述】:

我有一个包含许多列和许多重复行的表

由C1、C2、Year、C3、C5列组成的主键,我只想根据较高的Date、C6和C4列(按此顺序)保留每个重复行的一行

例如:让我们取最后 2 行,基于 4 列(我们的主键),我们必须只保留其中的一个并这样做:我们首先比较哪一行具有最高的 Date 列(它们具有相同的日期),然后我们必须继续到第二列(C6),它们具有相同的值 = 0,最后我们比较 C4 列,我们取较高的(=1)。

对于这个例子,我们必须选择最后一行并删除另一行。

C1  C2  Year      C3   C4  C5  C6     Date
------------------------------------------------------------------
100 74  2013    2697    0   1   0   11/06/2013
100 74  2013    2697    1   1   0   11/06/2013
100 74  2013    2697    0   1   1   12/06/2013
100 74  2013    2707        1   0   11/06/2013
100 74  2013    2707        2   0   11/06/2013
100 74  2013    2707        3   0   11/06/2013
100 74  2013    2708    0   1   0   11/06/2013
100 74  2013    2708    1   1   0   11/06/2013
100 74  2013    2708    1   1   1   25/06/2013
100 74  2013    2708    0   1   1   30/06/2013
100 74  2013    3211    0   1   0   28/07/2013
100 74  2013    3211    1   1   0   28/07/2013

谢谢

【问题讨论】:

  • This answer 可能会给你一些指示,如果我明白你在做什么?
  • 根据您的示例数据,此语句“主键由 C1、C2、Year、C3、C5 列组成”是错误的。您的意思是要根据这些列创建主键吗?
  • @Yaroslav Shabalin 你是对的,在这个例子中它不是主键,但我需要它来只保留一行以消除重复行,然后我必须将这些行插入另一个表中尊重 C1、C2、Year、C3 和 C5 作为主键

标签: sql oracle plsql


【解决方案1】:

总体思路:

SELECT 
  DENSE_RANK() OVER (PARTITION BY c1, c2, year, c3, c5 ORDER BY date, c6, c4) 
FROM table

您可能希望将其包装在另一个 SELECT 中以剪切重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 2012-12-07
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多