【问题标题】:How to get uniq rows from duplicate records in oracle?oracle如何从重复记录中获取唯一行?
【发布时间】:2019-03-20 00:05:54
【问题描述】:

我想从表中为每个 bucket_type 获取最快的 quotaBasedService 行。 packageSpeed 的值在 AdditionalQuota 表中,package_id 和其他字段在 quotaBased 表中。

SELECT
      q.ID,
      q.SUBSCRIBER_IDENTIFIER,
      q.BUCKET_TYPE,
      MAX(CASE WHEN ext.PACKAGE_SPEED = 0 THEN 999999 ELSE ext.PACKAGE_SPEED END) AS PACKAGE_SPEED
    FROM PIMS_QUOTA_BASED_SERVICE q
      INNER JOIN PIMS_ADDITIONAL_QUOTA_PACKAGE ext ON ext.PACKAGE_ID = q.ADDITIONAL_QUOTA_PACKAGE_ID
    WHERE q.PERIOD = '201810' AND q.BUCKET_TYPE IS NOT NULL
    GROUP BY
      q.SUBSCRIBER_IDENTIFIER,
      q.BUCKET_TYPE,
      q.ID
    ORDER BY SUBSCRIBER_IDENTIFIER, BUCKET_TYPE, PACKAGE_SPEED DESC

这里是sql结果 quotaBasedId、subs_identifier、bucket_type、速度

108337,subscriber1@domain,Extra,999999
108345,subscriber1@domain,Extra,5120
108334,subscriber1@domain,Extra1,999999
108342,subscriber1@domain,Extra1,5120
108336,subscriber1@domain,Extra2,999999
108344,subscriber1@domain,Extra2,5120
108335,subscriber1@domain,Extra4,999999
108343,subscriber1@domain,Extra4,5120
108253,subscriber2@domain,Extra,999999
108261,subscriber2@domain,Extra,5120
108250,subscriber2@domain,Extra1,999999
108258,subscriber2@domain,Extra1,5120
108252,subscriber2@domain,Extra2,999999
108260,subscriber2@domain,Extra2,5120
108251,subscriber2@domain,Extra4,999999
108259,subscriber2@domain,Extra4,5120

我的期望就在这里

108337,subscriber1@domain,Extra,999999
108334,subscriber1@domain,Extra1,999999
108336,subscriber1@domain,Extra2,999999
108335,subscriber1@domain,Extra4,999999
108253,subscriber2@domain,Extra,999999
108250,subscriber2@domain,Extra1,999999
108252,subscriber2@domain,Extra2,999999
108251,subscriber2@domain,Extra4,999999

【问题讨论】:

    标签: sql oracle subquery inner-join


    【解决方案1】:

    我认为您只需从group byselect 中删除id

    SELECT q.SUBSCRIBER_IDENTIFIER, q.BUCKET_TYPE,
           MAX(CASE WHEN ext.PACKAGE_SPEED = 0 THEN 999999 ELSE ext.PACKAGE_SPEED END) AS PACKAGE_SPEED
    FROM PIMS_QUOTA_BASED_SERVICE q INNER JOIN
         PIMS_ADDITIONAL_QUOTA_PACKAGE ext
         ON ext.PACKAGE_ID = q.ADDITIONAL_QUOTA_PACKAGE_ID
    WHERE q.PERIOD = '201810' AND q.BUCKET_TYPE IS NOT NULL
    GROUP BY q.SUBSCRIBER_IDENTIFIER, q.BUCKET_TYPE
    ORDER BY SUBSCRIBER_IDENTIFIER, BUCKET_TYPE;
    

    如果你想要id,那么你需要一个聚合函数,可能是MIN()

    【讨论】:

      【解决方案2】:

      我认为你不需要在GROUP BY 子句中使用q.ID

      SELECT q.SUBSCRIBER_IDENTIFIER, q.BUCKET_TYPE,
             MAX(CASE WHEN ext.PACKAGE_SPEED = 0 THEN 999999 ELSE ext.PACKAGE_SPEED END) AS PACKAGE_SPEED
      FROM PIMS_QUOTA_BASED_SERVICE q INNER JOIN
           PIMS_ADDITIONAL_QUOTA_PACKAGE ext
           ON ext.PACKAGE_ID = q.ADDITIONAL_QUOTA_PACKAGE_ID
      WHERE q.PERIOD = '201810' AND q.BUCKET_TYPE IS NOT NULL
      GROUP BY q.SUBSCRIBER_IDENTIFIER, q.BUCKET_TYPE
      ORDER BY SUBSCRIBER_IDENTIFIER, BUCKET_TYPE;
      

      如果你想要q.ID,然后使用min()/max() 聚合它:

      【讨论】:

        【解决方案3】:

        或者设置 MAX ID 这样,你也会得到 ID

        SELECT
              MAX(q.ID),
              q.SUBSCRIBER_IDENTIFIER,
              q.BUCKET_TYPE,
              MAX(CASE WHEN ext.PACKAGE_SPEED = 0 THEN 999999 ELSE ext.PACKAGE_SPEED END) AS PACKAGE_SPEED
            FROM PIMS_QUOTA_BASED_SERVICE q
              INNER JOIN PIMS_ADDITIONAL_QUOTA_PACKAGE ext ON ext.PACKAGE_ID = q.ADDITIONAL_QUOTA_PACKAGE_ID
            WHERE q.PERIOD = '201810' AND q.BUCKET_TYPE IS NOT NULL
            GROUP BY
              q.SUBSCRIBER_IDENTIFIER,
              q.BUCKET_TYPE,
            ORDER BY SUBSCRIBER_IDENTIFIER, BUCKET_TYPE, PACKAGE_SPEED DESC
        

        【讨论】:

        • 祝福你!
        猜你喜欢
        • 2012-09-28
        • 1970-01-01
        • 2022-12-06
        • 2011-01-11
        • 1970-01-01
        • 2020-01-20
        • 2016-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多