Oracle:基于组

时间:2018-03-16 10:11:19

标签: sql oracle

我需要一个SQL-Query来删除表中的重复项。让我们从我的表开始

rc_document :(有更多条目,这只是一个例子)

+----------------+-------------+----------------------+
| rc_document_id | document_id | rc_document_group_id |
+----------------+-------------+----------------------+
|              1 |           1 |                    1 |
|              2 |           2 |                    1 |
|              3 |           3 |                    1 |
|              4 |           4 |                    1 |
|              5 |           1 |                    2 |
|              6 |           3 |                    2 |
+----------------+-------------+----------------------+
(document_id can be exists in mulitple rc_document-group´s)

rc_document_group

+----------------------+----------+
| rc_document_group_id | priority |
+----------------------+----------+
|                    1 |        1 |
|                    2 |        2 |
+----------------------+----------+

每个rc_document都可以与rc_document_group连接。在rc_document_group中是每个rc_document的优先级。

我想删除rc_document行,其中document_id在rc_document_group中没有最高优先级。因为document_id可以存在于多个rc_document-group中..我只想保留那个,具有最高优先级。

这是我删除重复的document_id后的预期rc_document表

+----------------+-------------+----------------------+
| rc_document_id | document_id | rc_document_group_id |
+----------------+-------------+----------------------+
|              2 |           2 |                    1 |
|              4 |           4 |                    1 |
|              5 |           1 |                    2 |
|              6 |           3 |                    2 |
+----------------+-------------+----------------------+

必须删除带有rc_document_id 1和3的rc_document,因为document_id 1和3位于另一个具有更高优先级的rc_document_group中。

我是sql中的新手,我不知道如何编写这些sql查询...谢谢你的帮助!!

1 个答案:

答案 0 :(得分:1)

首先,您可以加入这两个表,以便在每一行上获得相应的优先级。之后,您可以使用分析函数MAX()为每一行获取每个document_id组中的最大优先级。此时,您将过滤掉优先级不等于组中最大优先级的行。

尝试此查询:

SELECT t.rc_document_id,
       t.document_id,
       t.rc_document_group_id
  FROM (SELECT d.*,
               g.priority,
               MAX(g.priority) OVER(PARTITION BY document_id) max_priority
         FROM rc_document d
        INNER JOIN rc_document_group g
           ON d.rc_document_group_id = g.rc_document_group_id) t
 WHERE t.priority = t.max_priority