Oracle

根據最大日期從多個記錄中選擇唯一記錄

  • August 24, 2021

我有如下表

+----+----------+-----+-------------+--------+
| ID |   ADDR   | IND | update_Date | Sq_NBR |
+----+----------+-----+-------------+--------+
|  1 | PHYSICAL | Y   | 11-Oct      |   1293 |
|  1 | BILL     | Y   | 10-Oct      |   1357 |
|  1 | BILL     | N   | 10-Sep      |  13567 |
|  1 | PHYSICAL | Y   | 10-Oct      |   8403 |
|  1 | BILL     | Y   | 6-Oct       |    135 |
|  2 | PHYSICAL | Y   | 9-Oct       |   5333 |
|  2 | BILL     | N   | 8-Aug       |    657 |
|  2 | BILL     | Y   | 8-Oct       |   3673 |
|  2 | BILL     | Y   | 10-Oct      |   2574 |
|  3 | BILL     | Y   | 11-Oct      |  57923 |
|  3 | BILL     | Y   | 11-Oct      |  29384 |
+----+----------+-----+-------------+--------+

在填充數據之前需要檢查以下多個條件

  1. 如果記錄具有重複 id、addr 和 Ind 的組合,則從該記錄中選擇 max(update_date)。
  2. 如果記錄有重複的id、addr、Ind和update_Date的組合,則從重複記錄中只選擇一條記錄(可以是任何記錄)。

以下是預期的結果。

誰能給我一些想法來實現這一點。

這是 sqlfiddle: http ://sqlfiddle.com/#!4/d0098/1

+----+----------+-----+-------------+--------+
| ID |   ADDR   | IND | Update_Date | Sq_NBR |
+----+----------+-----+-------------+--------+
|  1 | PHYSICAL | Y   | 11-Oct      |   1293 |
|  1 | BILL     | Y   | 10-Oct      |   1357 |
|  1 | BILL     | N   | 10-Sep      |  13567 |
|  2 | PHYSICAL | Y   | 9-Oct       |   5333 |
|  2 | BILL     | N   | 8-Aug       |    657 |
|  2 | BILL     | Y   | 10-Oct      |   2574 |
|  3 | BILL     | Y   | 11-Oct      |  29384 |
+----+----------+-----+-------------+--------+

下面的查詢給了我想要的結果:

SELECT  
      ID,
      ADDR,
      IND,
      UPDATE_DATE,
      SQ_NBR           
FROM (
SELECT ID,
      ADDR,
      IND,
      UPDATE_DATE,
      SQ_NBR,
      ROW_NUMBER() OVER (PARTITION BY ID , ADDR , IND ORDER BY UPDATE_DATE DESC) RMN
FROM TEST_TABLE ) A
WHERE RMN = 1

對於第一個條件

  • count() Over(按 id、addr、Ind 分區)
  • max(update_date) Over(按 id、addr、Ind 分區)

對於第二個條件

  • row_number Over(按 id、addr、Ind 和 update_Date 分區)

引用自:https://dba.stackexchange.com/questions/219908