【问题标题】:Oracle select query to filter rowsOracle 选择查询以过滤行
【发布时间】:2015-11-14 17:18:27
【问题描述】:

假设我有一个包含以下值的表

id (PK) a_num  a_code effect_dt  expire_dt
32      1234   abcd   01/01/2015 05/30/2015
9       1234   abcd   06/01/2015 12/31/2015
5       1234   efgh   01/01/2015 05/30/2015
14      1234   efgh   06/01/2015 12/31/2015

如何从a_num,a_code 对中仅选择一条记录。 ID 是 1,3 还是 2,4?在某些情况下,a_num,a_code 对可能有超过 2 条记录。

UPDATE - ID 不一定总是有序的,它只是一个主键。

【问题讨论】:

    标签: sql oracle select oracle11g


    【解决方案1】:

    这将为您提供第 1 行和第 3 行

    Select * from (
       Select * , Row_number() Over(Partition by a_num, a_code order by id) r_num from Your_Table ) result
    Where r_num = 1
    

    只需按顺序使用DESC,您将获得第 2 行和第 4 行

    Select * from (
       Select * , Row_number() Over(Partition by a_num, a_code order by id desc) r_num from Your_Table ) result
    Where r_num = 1
    

    【讨论】:

    • 如果 id 不一定总是按顺序排列怎么办?
    • 在这种情况下,您可以使用 Effect_dt 而不是 ID 这完全取决于您需要的订单。您可以相应地更改列名。
    【解决方案2】:

    一种方法是使用row_number 窗口函数:

    SELECT id, a_num, a_code, effect_dt, expire_dt
    FROM   (SELECT id, a_num, a_code, effect_dt, expire_dt,
                   ROW_NUMBER() OVER (PARTITION BY a_num, a_code
                                      ORDER BY 1) AS rn
            FROM   mytable) t
    WHERE  rn = 1
    

    【讨论】:

      猜你喜欢
      • 2020-06-13
      • 1970-01-01
      • 2021-09-27
      • 2018-08-14
      • 2015-08-19
      • 2018-02-17
      • 1970-01-01
      • 2016-03-30
      • 2017-11-04
      相关资源
      最近更新 更多