Sql Oracle中的条件秩
我正在寻找一个根据条件计算排名的查询,如下所示: “排名指数”是我正在寻找的计算——如果前一时间和当前时间之间的差异小于6小时,那么计数器应该保持不变。如果超过6小时,则将指数提升1Sql 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
有什么想法吗?根据您的解释,最后一个值应该是
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
?它应该是日期
或时间戳
(或者可能是带时区的时间戳
);您的示例只显示了一些字符串,可能表示一天中的时间,但重要的是用于列的数据类型。