sql - 检测 postgres 表中的一系列下降值

标签 sql postgresql

我有一个包含一系列日期、客户 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 为真,所有其他行为假。

Sample SQL Fiddle

要仅获取每个 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/

相关文章:

mysql - 为时尚在线商店设计数据库时出现的问题

sql - 与数据库无关的应用程序的数据库设计

sql - 在 PL/pgSQL 中调用另一个函数内部的函数

sql - 在 PostgreSQL 中将 select 语句嵌套在 array_to_json(array_agg(row_to_json())) 内

postgresql - 尝试将 Postgresql 列类型从 varchar 更改为 bytea 无限期挂起

mysql - 在子查询中使用自引用更新行

mysql - 如何对连接中的数据执行 "where"子句

sql - 我想知道哪个表存储事件触发器的触发器的创建语句,例如

sql - 喜欢你的用户 (EXISTS) 但你没有与之聊天 (NOT EXISTS)

postgresql - 如何在postgres函数中返回表及其总计数