因此,我需要返回查询中最近的24个连续小时。表保存每小时的数据。得到最后24小时不是一个问题,但我有时有丢失的数据,因此需要进一步回到过去的时间,以找到第一个“完整”的24小时集。
select date, value from TABLE
where date >= (select max(date)-1 from TABLE)
然而,有时我会因为这个问题错过几个小时。我如何确保我总是得到24排回来,这是最近的一个街区的24小时?
下面是一个例子:
a类通知,2020年1月31日第23小时缺失,因此应返回2020年1月31日第22小时至2020年1月30日第23小时。b类应返回2020年1月2日第0小时到2020年1月31日第1小时。
3条答案
按热度按时间jexiocij1#
你需要走几步。首先,对于每个记录,您需要查看它有多少小时的连续的前一个数据。这就是
grouped_hour_data
子句在下面的解决方案中不起作用。然后,您需要从该结果中进行选择,只获取具有完整24小时连续的前一个数据的行。然后只取其中的前24行。
此解决方案经过简化,以利用以下事实:所有日期都被截断为小时,并且没有重复的日期。如果你的问题比这更复杂,这个解决方案仍然可以支持它,但需要修改。
在这个例子中,我们创建了几天以前的测试数据,但是删除了16日和17日个别时间的数据,这样连续的第一个24小时周期就在16日提前结束了。
编辑:处理类别字段
处理额外的
category
在你添加的字段中,你需要做一些事情。第一,
PARTITION BY category
当你在计算cnt
现场。这将导致在计算此值时,每个类别的数据都被单独处理。因此,例如,类别a在第2小时的值将不会计为类别b在第2小时的值。第二,你不能再使用
FETCH FIRST 24 ROWS ONLY
获取所需的数据,因为现在需要每个类别中的前24行。所以,你需要一个额外的步骤(ordered_groups
,对每个类别中前面连续24小时有数据的行进行排序。这叫命令rn
然后,在最后一个查询中,只需选择where rn <= 24
.披露:我没有测试这个更新的逻辑,所以可能有一些错误。
bqucvtff2#
看起来你实际上是在你的每小时表的最后24行。如果是这样,可以使用行限制子句:
或者如果每小时可能有多个记录,那么另一个选项是
dense_rank()
:qxgroojn3#
[编辑]以下内容适用于您: