【问题标题】:Finding duplicate rows while Inserting data into Oracle table在将数据插入 Oracle 表时查找重复行
【发布时间】:2017-07-30 22:22:34
【问题描述】:

我有一个 oracle 表 dm_djr_bulkjob,其中包含以下列和示例数据。

+----------+------+-----------+------------------+------+----------------------+
| device_id| cg_id|firmware_id| best_status      |dmc_id|oltp_updated          |
+----------+------+-----------+------------------+------+----------------------+
| 2009160  | 000  |25822      |No Device Response|1736  |27-JUL-17 10:00:00 AM |
| 2009160  | 000  |25822      |401               |1736  |27-JUL-17 14:00:00 PM |
| 2009157  | 000  |25745      |Wifi Deferred     |1736  |27-JUL-17 02:00:00 AM |
| 2009174  | 000  |25861      |Low Memory        |1736  |27-JUL-17 08:00:00 AM |
+----------+------+-----------+------------------+------+----------------------+

我正在运行查询以使用以下查询将数据插入临时表:

insert into DM_ETLTEMP_BULK_BSTRESULT_SUMM
(
device_id,
cg_id,
firmware_id,
best_status,
dmc_id
)SELECT device_id, cg_id, firmware_id, best_Status, dmc_id
from dm_djr_bulkjob where oltp_updated between '27-JUL-17' and '28-JUL-17'

此查询会将 dm_djr_bulkjob 表中的所有记录插入到我的临时表中。 我想从重复记录中选择一条记录(我们有基于device_id和firmware_id的重复记录)

Duplicate records for device_id= 2009160 and firmware_id = 25822

我想要两个重复值中的一个记录,该记录在下面的优先级表中具有 best_status 优先级。 例如:上面的查询返回了两个重复条目,device_id=2009160 和firmware_id = 25822,但两条记录中的 best_status='No Device Response' 在下表中具有最低优先级。

所以我最终插入临时表的记录数应该如下。

+----------+------+-----------+------------------+------+
| device_id| cg_id|firmware_id| best_status      |dmc_id|
+----------+------+-----------+------------------+------+
| 2009160  | 000  |25822      |No Device Response|1736  |
| 2009157  | 000  |25745      |Wifi Deferred     |1736  |
| 2009174  | 000  |25861      |Low Memory        |1736  |
+----------+------+-----------+------------------+------+

优先级表

+-------------------+--------+
| status            |priority|
+-------------------+--------+
|No Device Response |1       |
|401                |2       |
|402                |3       |
|500                |4       |
|Wifi Deferred      |5       |
|Low Memory         |6       |
| No Device Response|7       |
+-------------------+--------+

请提出查询以解决此要求。

提前致谢!

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我会在优先级表中添加一个连接,并添加一个分析函数来选择首选行以防出现重复。查询如下所示:

    Select device_id, cg_id, firmware_id, best_Status, dmc_id 
      From (Select a.device_id, a.cg_id, a.firmware_id, a.best_Status, a.dmc_id,
                   rank() Over (Partition By a.device_id, a.firmware_id 
                                    Order By b.priority) As rnk
              From dm_djr_bulkjob a
              Join priority_table b on b.best_status = a.best_status
             Where a.oltp_updated Between '27-JUL-17' And '28-JUL-17')
     Where rnk = 1;
    

    rank() 函数为每一行分配一个排名编号,这样每个唯一(device_id,firmware_id)组合的一行将具有 rnk = 1:具有最低优先级的行。

    【讨论】:

      【解决方案2】:
              INSERT
              INTO DM_ETLTEMP_BULK_BSTRESULT_SUMM
                  (
                      device_id,
                      cg_id,
                      firmware_id,
                      best_status,
                      dmc_id
                  )
             SELECT  device_id,
                  cg_id,
                  firmware_id,
                  best_Status,
                  dmc_id
              FROM
                  (SELECT  device_id,
                          cg_id,
                          firmware_id,
                          best_Status,
                          dmc_id,
                          COUNT(*)
                      FROM dm_djr_bulkjob
                      WHERE oltp_updated BETWEEN '27-JUL-17' AND '28-JUL-17'
                      GROUP BY device_id,
                          cg_id,
                          firmware_id,
                          best_Status,
                          dmc_id
                      HAVING COUNT(*)<2
                  )
              );
      

      试试这个:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-09
        • 2011-12-07
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多