Sql 获取有效的日期范围。最小值和最大值
我需要根据有效性范围获取表的值。目前,我根据表格的列进行分组,并对该年的最小值和最大值进行分组;但对于这个例子,这给了我错误的结果。我需要用sql语句或pentaho来解决它 样本数据:Sql 获取有效的日期范围。最小值和最大值,sql,postgresql,validation,pentaho,pentaho-data-integration,Sql,Postgresql,Validation,Pentaho,Pentaho Data Integration,我需要根据有效性范围获取表的值。目前,我根据表格的列进行分组,并对该年的最小值和最大值进行分组;但对于这个例子,这给了我错误的结果。我需要用sql语句或pentaho来解决它 样本数据: year validity Value1 Value2 2004 A B 2006 A C 2007 A B 2008 A B SQL: 错误结果: year
year validity Value1 Value2
2004 A B
2006 A C
2007 A B
2008 A B
SQL:
错误结果:
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');
另一个“缺口和孤岛”问题。
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');