我有一个包含一系列日期、客户 ID 和整数的表格,该表格每周更新所有 ID 的新日期和整数值。
我希望能够编写一个查询来检测最近的三个值是否按降序排列,并为每个 ID 返回 TRUE 或 FALSE。
所以,对于表格:
ID | Weekending | Value
1 | 2015-07-15 | 5
2 | 2015-07-15 | 23
1 | 2015-07-08 | 7
2 | 2015-07-08 | 21
1 | 2015-07-01 | 9
2 | 2015-07-01 | 24
我想要一个针对 ID:1 返回 TRUE 的查询,因为三个连续的值下降了,但对 ID:2 返回 FALSE,因为值增加了。
最佳答案
不确定性能,但像这样使用 lag
窗口函数应该可行:
select *,
case when
value < lag(value, 1) over (partition by id order by weekending)
and value < lag(value, 2) over (partition by id order by weekending)
then 'True' else 'False' end
from t
order by id, weekending desc;
这将标记行 1 | 2015-07-15 | 5
为真,所有其他行为假。
要仅获取每个 id 的最后一行,您可以这样做:
select ID, Weekending, Value, decrease
from (
select *,
case when
value < lag(value, 1) over (partition by id order by weekending)
and value < lag(value, 2) over (partition by id order by weekending)
then 'True' else 'False' end as decrease,
row_number() over (partition by id order by weekending desc) as r
from t
) src
where r = 1;
这会给你这样的结果:
ID Weekending Value decrease
1 2015-07-15 5 True
2 2015-07-15 23 False
关于sql - 检测 postgres 表中的一系列下降值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31924213/