SQL查询在事实表中查找趋势

时间:2018-10-25 15:11:02

标签: sql hiveql

我有一个如下的事实表,如何找到在给定时间内其值下降的实体? 例如,选择在2014-01-012014-01-04

之间减小的实体和值
entity_id | value | date
12        | 15    | 2014-01-01 
56        | 21    | 2014-01-04
12        | 15    | 2014-01-04 
56        | 21    | 2014-01-02 
12        | 25    | 2014-01-02 
12        | 16    | 2014-01-03 

例如,在日期2014-01-012014-01-04之间 实体ID 12的值减少了两次:

entity_id | value | date       | old_value
12        | 16    | 2014-01-03 | 25
12        | 15    | 2014-01-04 | 16

3 个答案:

答案 0 :(得分:1)

我认为您想要lag()

select t.*
from (select t.*, lag(value) over (partition by entity_id order by date) as prev_value
      from t
     ) t
where prev_value > value;

您可以为特定的日期范围添加and date >= '2014-01-01' and date <= '2014-01-04'

答案 1 :(得分:0)

MySQL中的范围仅为<或>或=,您可以根据需要组合它们,但仍可以使用%% date%检索所需的相似日期

答案 2 :(得分:0)

假设您的表名为entity

SELECT e.entity_id, e.value as old_value, e2.value as new_value, v2.date
FROM entity e
JOIN entity e2 ON v.entity_id = v2.entity_id
AND e.date < e2.date
AND e.value > e2.value
GROUP BY e.date