Sql 事件表中最后一个和第二个最后一个事件之间的差异

Sql 事件表中最后一个和第二个最后一个事件之间的差异,sql,sql-server,Sql,Sql Server,我有下表 它是由 create table events ( event_type integer not null, value integer not null, time timestamp not null, unique (event_type, time) ); 给定pic中的数据,我想为每个已被调用的事件类型编写一个查询 多次注册返回最新和最新版本之间的差异 第二个最新值 鉴于上述数据,输出应该如下 event_type value 2

我有下表

它是由

create table events (
    event_type integer not null,
    value integer not null,
    time timestamp not null,
    unique (event_type, time)
);
给定pic中的数据,我想为每个已被调用的事件类型编写一个查询 多次注册返回最新和最新版本之间的差异 第二个最新值

鉴于上述数据,输出应该如下

event_type value
2          -5
3           4
我用以下方法解决了这个问题:

CREATE VIEW [max_date] AS
SELECT event_type, max(time) as time, value
FROM events
group by event_type
having count(event_type) >1
order by time desc;


select event_type, value
from
(
    select event_type, value, max(time)
    from(
         Select E1.event_type, ([max_date].value - E1.value) as value, E1.time
         From events E1, [max_date]
         Where [max_date].event_type = E1.event_type
         and [max_date].time > E1.time
        )
    group by event_type
 )
但这似乎是一个非常复杂的问题,我想知道是否有更简单的方法

您可以使用滞后和行数

内部查询按时间降序排列具有相同事件类型的记录,并计算每个值与前一个值之间的差值

然后,外部查询只筛选每个组的顶部记录。

您可以使用lag和row\u number

内部查询按时间降序排列具有相同事件类型的记录,并计算每个值与前一个值之间的差值

然后,外部查询只筛选每个组的顶部记录。

使用窗口功能:

select e.*,
       (value - prev_value)
from (select e.*, 
             lag(value) over (partition by event_type order by time) as prev_value,
             row_number() over (partition by event_type order by time desc) as seqnum
      from events e
     ) e
where seqnum = 1 and prev_value is not null;
使用窗口功能:

select e.*,
       (value - prev_value)
from (select e.*, 
             lag(value) over (partition by event_type order by time) as prev_value,
             row_number() over (partition by event_type order by time desc) as seqnum
      from events e
     ) e
where seqnum = 1 and prev_value is not null;

下面是一种结合使用分析函数和聚合的方法。如果数据库不支持超前和滞后,这种方法是友好的


下面是一种结合使用分析函数和聚合的方法。如果数据库不支持超前和滞后,这种方法是友好的


您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加@用户9071833。我不明白为什么值不是-4和-5。您使用的是哪种DBMS产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加@用户9071833。我不明白为什么值不是-4和-5。@user9071833。那应该是desc.@user9071833。这应该是desc.small change select event_type,val from select event_type,value-lagvalue overpartition by event_type order by time val,row_number overpartition by event_type order by time desc from events t,其中rn=1,val不是null small change select event_type,val从事件类型中选择,value-lagvalue按事件类型超额分配按时间顺序超额分配val,行数按事件类型超额分配按时间顺序超额分配从事件t中删除,其中rn=1且val不为空
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY event_type ORDER BY time DESC)
    FROM events
)

SELECT
    event_type,
    MAX(CASE WHEN rn = 1 THEN value END) - MAX(CASE WHEN rn = 2 THEN value END) AS value
FROM cte
GROUP BY
    event_type
HAVING
    COUNT(*) > 1;