带有 case when 和 group by 的 Value 列的计数

Count of Value column with case when and group by

Table:

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)
谢谢!!

您可以为每个 Id 值创建最大和最小年份的派生 table,然后计算与这些值匹配的 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

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