带有 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
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
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
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