Sql Oracle中的条件秩

Sql Oracle中的条件秩,sql,oracle,Sql,Oracle,我正在寻找一个根据条件计算排名的查询,如下所示: “排名指数”是我正在寻找的计算——如果前一时间和当前时间之间的差异小于6小时,那么计数器应该保持不变。如果超过6小时,则将指数提升1 有什么想法吗?根据您的解释,最后一个值应该是4而不是5 使用lag()和累积总和。假设datetime列存储为date: select t.*, sum(case when prev_datetime > datetime - interval '6' hour then 0 else 1 e

我正在寻找一个根据条件计算排名的查询,如下所示:

“排名指数”是我正在寻找的计算——如果前一时间和当前时间之间的差异小于6小时,那么计数器应该保持不变。如果超过6小时,则将指数提升1


有什么想法吗?

根据您的解释,最后一个值应该是
4
而不是
5

使用
lag()
和累积总和。假设
datetime
列存储为
date

select t.*,
       sum(case when prev_datetime > datetime - interval '6' hour then 0 else 1 end) over
           (order by datetime) as rank_index
from (select t.*,
             lag(datetime) over (order by datetime) as prev_datetime
      from t
     ) t;

注意:如果要为每个
key1
/
key2
组合使用此项,则需要在窗口规范中包括
按key1、key2划分的分区。

根据您的解释,最后一个值应该是
4
而不是
5

使用
lag()
和累积总和。假设
datetime
列存储为
date

select t.*,
       sum(case when prev_datetime > datetime - interval '6' hour then 0 else 1 end) over
           (order by datetime) as rank_index
from (select t.*,
             lag(datetime) over (order by datetime) as prev_datetime
      from t
     ) t;

注意:如果您希望对每个
key1
/
key2
组合使用此项,那么您希望在窗口规范中包括
按key1、key2划分。

如果增量是按
1
,为什么最后一个值从3变为5?(1)您的Oracle版本是什么?如果您不知道,请使用
选择*from v$version
。(2) 你说“离前一排还有六个小时”。这是正确的,还是你需要“从当前排名的第一排开始六个小时”?两者都是有效的问题;你问的那个不太常见,我描述的那个更常见(但也更难)。(3) 什么数据类型是
datetime
?它应该是
日期
时间戳
(或者可能是带时区的
时间戳
);您的示例只显示了一些字符串,可能表示一天中的时间,但重要的是用于列的数据类型。如果增量为
1
,为什么最后一个值从3变为5?(1)您的Oracle版本是什么?如果您不知道,请使用
选择*from v$version
。(2) 你说“离前一排还有六个小时”。这是正确的,还是你需要“从当前排名的第一排开始六个小时”?两者都是有效的问题;你问的那个不太常见,我描述的那个更常见(但也更难)。(3) 什么数据类型是
datetime
?它应该是
日期
时间戳
(或者可能是带时区的
时间戳
);您的示例只显示了一些字符串,可能表示一天中的时间,但重要的是用于列的数据类型。