预言机:用于基于组删除重复行的 sql 查询



我需要SQL查询来删除表中的重复项。让我们从我的桌子开始

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组中。我只想保留那个,具有最高优先级。

这是我删除重复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 |
+----------------+-------------+----------------------+

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

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

首先,您可以连接两个表,以便在每行上获得相应的优先级。之后,您可以使用分析函数 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

最新更新