sql - 获取有效的日期范围。最小值和最大值
问题描述
我需要按有效范围获取表的值。目前我按表格的列进行分组,并对年份进行最小值和最大值;但这给了我这个例子的错误结果。我需要用句子 sql 或 pentaho 来解决它
样本数据:
year validity Value1 Value2
2004 A B
2006 A C
2007 A B
2008 A B
SQL:
SELECT
min(anio), max(anio), value1, value2
FROM tabla
GROUP BY
value1, value2
错误的结果:
year min year max Value1 Value2
2004 2008 A B
2006 2006 A C
预期结果:
year min year max Value1 Value2
2004 2004 A B
2007 2008 A B
2006 2006 A C
请帮助解决这个问题。
解决方案
您可以组合LAG()
和SUM()
窗口函数根据您的逻辑将行分成组。一旦分离,计算最小值和最大值是微不足道的。
例如:
select
min(year_validity) as year_min,
max(year_validity) as year_max,
min(value1) as value1,
min(value2) as value2
from (
select
*,
sum(init) over(order by year_validity) as grp
from (
select *,
case when not ( (value1, value2) = (
lag(value1) over(order by year_validity),
lag(value2) over(order by year_validity)
) ) then 1 else 0 end as init
from tabla
) x
) y
group by grp
order by value1, value2
结果:
year_min year_max value1 value2
-------- -------- ------ ------
2004 2004 A B
2007 2008 A B
2006 2006 A C
作为记录,本案例的数据脚本为:
create table tabla (
year_validity int,
value1 varchar(10),
value2 varchar(10)
);
insert into tabla (year_validity, value1, value2) values (2004, 'A', 'B');
insert into tabla (year_validity, value1, value2) values (2006, 'A', 'C');
insert into tabla (year_validity, value1, value2) values (2007, 'A', 'B');
insert into tabla (year_validity, value1, value2) values (2008, 'A', 'B');
推荐阅读
- ios - 当应用程序在后台时播放音频
- python - 在 dtype 上失败的 python 中合并 dask 数据帧,如何更改?
- git - Git Stash 的新分支会影响其他存储吗?
- ios - 显示键盘后离开应用程序时出现快照错误(需要 afterScreenUpdates:YES)
- ios - 如何在 Safari 上强制显示 Smart App Banner?
- android - Android App Bundle 版本代码突然很高
- javascript - 在 FormGuard 上使用 CanActivate 阻止用户绕过 URL 时出错
- regex - 根据条件生成多个或单个单元格值?
- junit - 在junit中模拟DAO层中的特定方法
- javascript - TestCases 没有通过,而 console.log 是正确的