2017-07-30 12 views
0

私は、下の列とサンプルデータを持つOracleテーブルdm_djr_bulkjobを持っています。私は、クエリの下に使用して一時テーブルにデータを挿入するクエリを実行していますOracleテーブルにデータを挿入中に重複行を検索

+----------+------+-----------+------------------+------+----------------------+ 
| 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テーブルからすべてのレコードを挿入します。 は、私は以下の優先度テーブルから最小としてbest_status優先順位を持つ2つの重複する値のうち一つのレコードをしたい

Duplicate records for device_id= 2009160 and firmware_id = 25822 

(私たちはDEVICE_IDとfirmware_idに基づいて重複したレコードを持っている)重複レコードのうちの1つのレコードを選択します。 例:上記のクエリは、device_id = 2009160とfirmware_id = 25822の2つの重複したエントリを返しましたが、2つのレコードの中の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  | 
+-------------------+--------+ 

は、この要件を解決するために、クエリを提案してください。

ありがとうございます!

答えて

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; 

ランク()関数は、各行に有するであろうユニーク(DEVICE_ID、firmware_id)の組み合わせごとに、このような1つの行をランク番号を割り当てRNK = 1:最低の優先度行。

+0

このクエリは、私の問題を解決しました..ありがとうございます。 –

0
 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 
      ) 
     ); 

これを試してみてください:)

関連する問題