【问题标题】:Oracle SQL get row with MAX value for each group in a set of grouped results [duplicate]Oracle SQL为一组分组结果中的每个组获取具有MAX值的行[重复]
【发布时间】:2019-07-30 14:49:17
【问题描述】:

我有一组通过运行得到的结果

SELECT 
       REV_USAGE_DATA.DDATE, 
       REV_USAGE_DATA.SEGMENT, 
       COUNT(*) AS Freq
FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
GROUP BY 
       REV_USAGE_DATA.DDATE,
       REV_USAGE_DATA.SEGMENT
ORDER BY 
REV_USAGE_DATA.DDATE

对于每个日期,我想获取 FREQ 列中具有最高值的整行。我怎样才能做到这一点?

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:

    您可以使用 CTE

    WITH CTE0 AS 
    (
      SELECT 
           REV_USAGE_DATA.DDATE, 
           REV_USAGE_DATA.SEGMENT, 
           COUNT(*) AS Freq
      FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
      GROUP BY 
           REV_USAGE_DATA.DDATE,
           REV_USAGE_DATA.SEGMENT
    )
    SELECT 
      DDATE,
      SEGMENT, 
      FREQ
    FROM CTE0 
    WHERE (DDATE, SEGMENT, FREQ) IN (
      SELECT DDATE, MAX(SEGMENT), MAX(FREQ)
      FROM CTE0 
      GROUP BY DDATE
    )
    

    【讨论】:

    • 就像一个魅力。谢谢
    【解决方案2】:

    使用ROW_NUMBER():

    SELECT DDATE, SEGMENT, Freq
    FROM (SELECT REV_USAGE_DATA.DDATE, REV_USAGE_DATA.SEGMENT, 
                 COUNT(*) AS Freq,
                 ROW_NUMBER() OVER (PARTITION BY REV_USAGE_DATA.DDATE ORDER BY COUNT(*) DESC) as seqnum
          FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
          GROUP BY REV_USAGE_DATA.DDATE,REV_USAGE_DATA.SEGMENT
         ) rud
    WHERE seqnum = 1
    ORDER BY REV_USAGE_DATA.DDATE;
    

    如果您在某个日期打成平手,并且想要所有最高值,请改用 RANK()

    【讨论】:

    • 谢谢,但是这给了我每个日期 4 行。事实上,它重现了我在问题中分享的相同结果集。
    • @tendaitakas。 . .对。它会这样做不是吗?我添加了执行您想要的过滤的 where 子句。
    【解决方案3】:

    很多类似的解决方案!这是我的。 使用 CTE 计算频率最高的记录(类似于 row-number)然后选择它们

    WITH data AS
    (
      SELECT 
           REV_USAGE_DATA.DDATE, 
           REV_USAGE_DATA.SEGMENT, 
           COUNT(*) AS Freq
      FROM CADA_PERMSISDN_DASH REV_USAGE_DATA
      GROUP BY 
             REV_USAGE_DATA.DDATE,
             REV_USAGE_DATA.SEGMENT
    ),
    maxRecords AS
    (
      SELECT DDATE, SEGMENT, FREQ, 
             CASE WHEN FREQ = MAX(FREQ) OVER(PARTITION BY DDATE) THEN 1 ELSE 0 END HighestFreq
      FROM data
    )
    
    SELECT DDATE, SEGMENT, FREQ
    FROM maxRecords
    WHERE HighestFreq = 1
    ORDER BY DDATE;
    

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多