【问题标题】:Count of Value column with case when and group by带有 case when 和 group by 的值列计数
【发布时间】:2020-09-06 09:48:32
【问题描述】:

表:

Date            Id       Value                    
2019-02-09      a1       ab            
2019-01-12      a2       cd
2019-12-12      a1       ab
2017-07-23      a1       ab
2018-12-09      a1       ab
2018-12-28      a1       cd
2016-11-09      a2       cd
2016-05-19      a2       ab

输出:

      Id        Max-Min               
      a1        1     
      a2       -1   

目的是创建Max_year_count-Min_year_count per Id
比如Value column中的计算:
(count of occurrence of value in max_year with group by Id)-(count of occurrence of value in min_year with group by Id)
谢谢!!

【问题讨论】:

    标签: sql oracle oracle-sqldeveloper


    【解决方案1】:

    Oracle 支持 FIRST/LAST 聚合:

    SELECT id,
        -- latest year's count
        Count(*) KEEP (Dense_Rank LAST  ORDER BY Extract(YEAR From "Date"))
         -- oldest year's count
      - Count(*) KEEP (Dense_Rank FIRST ORDER BY Extract(YEAR From "Date"))
    FROM DATA
    GROUP BY Id
    

    【讨论】:

    • 出于某种原因,第一个/最后一个永远不会留在我的脑海中......这绝对应该是公认的答案。
    【解决方案2】:

    您可以为每个Id 值创建一个最大和最小年份的派生表,然后计算与这些值匹配的id 值的年数并减去它们以获得Max-Min

    SELECT d.Id,
           COUNT(CASE WHEN EXTRACT(YEAR FROM "Date") = Max_Year THEN 1 END) -
           COUNT(CASE WHEN EXTRACT(YEAR FROM "Date") = Min_Year THEN 1 END) AS "Max-Min"
    FROM data d
    JOIN (SELECT Id, 
                 MAX(EXTRACT(YEAR FROM "Date")) AS Max_Year,
                 MIN(EXTRACT(YEAR FROM "Date")) AS Min_Year
          FROM data
          GROUP BY Id) m ON m.Id = d.Id
    GROUP BY d.Id
    

    输出:

    ID  Max-Min
    a1  1
    a2  -1
    

    Demo on dbfiddle

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 2021-03-15
      • 2015-07-21
      • 2014-05-15
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多