当前位置: 首页 > 面试题库 >

Oracle按连续的日期块选择数据

尉迟安民
2023-03-14
问题内容

我正在使用Oracle数据库,并且我有一个表,该表具有2列,其数据如下所示:

HASH | DATE
-----------------
abcd | 2017-11-01
abcd | 2017-11-02
abcd | 2017-11-03
wxyz | 2017-11-04
wxyz | 2017-11-05
abcd | 2017-11-06
wxyz | 2017-11-07
abcd | 2017-11-08
abcd | 2017-11-09
lmno | 2017-11-10
lmno | 2017-11-11

我想知道看到每个哈希的时间窗口。像

hash | start      | end
------------------------------
abcd | 2017-11-01 | 2017-11-03
wxyz | 2017-11-04 | 2017-11-05
abcd | 2017-11-06 | 2017-11-06
wxyz | 2017-11-07 | 2017-11-07
abcd | 2017-11-08 | 2017-11-09
lmno | 2017-11-10 | 2017-11-11

到目前为止,我基本上是这样的:

SELECT HASH, MIN(DATE) ST, MAX(DATE) ED
FROM HASH_TABLE 
GROUP BY HASH 
ORDER BY 3 DESC

这几乎可行,但是在2017-11-01开始到2017-11-09结束时,它会给我像“ abcd”一样,“隐藏”它在中间切换的事实。

是否可以通过连续的日期/时间“块”将这些结果分组?


问题答案:

看起来像是“缺口和孤岛”问题:

WITH cte("hash","date") AS (
    SELECT 'abcd',  DATE'2017-11-01' FROM dual UNION ALL
    SELECT 'abcd',  DATE'2017-11-02' FROM dual UNION ALL
    SELECT 'abcd',  DATE'2017-11-03' FROM dual UNION ALL
    SELECT 'wxyz',  DATE'2017-11-04' FROM dual UNION ALL
    SELECT 'wxyz',  DATE'2017-11-05' FROM dual UNION ALL
    SELECT 'abcd',  DATE'2017-11-06' FROM dual UNION ALL
    SELECT 'wxyz',  DATE'2017-11-07' FROM dual UNION ALL
    SELECT 'abcd',  DATE'2017-11-08' FROM dual UNION ALL
    SELECT 'abcd',  DATE'2017-11-09' FROM dual UNION ALL
    SELECT 'lmno',  DATE'2017-11-10' FROM dual UNION ALL
    SELECT 'lmno',  DATE'2017-11-11' FROM dual 
)
select "hash"
      ,min("date") as startdate
      ,max("date") as enddate
from (
    select "date","hash"
         , row_number() over (order by "date") 
         - row_number() over (partition by "hash" order by "date") as grp
    from cte
) A
group by "hash", grp
ORDER BY startdate;

DBFiddle演示



 类似资料:
  • 我试图选择头衔、姓氏、出生日期和头衔为“销售代表”并且他们出生在1950年之前或之后的国家。 当a把日期放在代码中时,它会给我一个错误。 我认为这是正确的: 它给ORA-01843的错误:不是有效的月份 如果你能帮助我,谢谢你。 以下是表格的示例数据:

  • 问题内容: 有没有检查连续日期的功能。我在处理以下问题时遇到问题: 我的表有一个包含以下数据的列: 给定的开始日期为,结束日期为。我想要的结果是: 有人可以建议什么吗? 问题答案: 我认为这是 “连续日期分组岛” 问题的一种变体。可以使用以下方法完成: SQL小提琴 结果 这是SQL Server 2005版本: SQL小提琴

  • 问题内容: 我在一个字段中有一个表格(其中包括日期)。 我需要获取所有列表的列表,这些列表比最早的日期更早,比最新的日期更早并且在表格中完全丢失。 因此,如果表包含: 我想要一个返回的查询: 问题答案: 这样的事情(假设您的表被命名,而date列被命名): 编辑: 该子句称为“公用表表达式”,等效于派生表(“内联视图”)。 类似于 第二个CTE使用Oracle实现中未记录的功能简单地“即时”创建日

  • 问题内容: 我有一个像这样的Oracle SELECT查询: 我的意思是,我想选择字段“ date_enter”今天所在的所有位置。我已经尝试过类似的操作,但是没有用。 忠告: 我不能使用TO_CHAR,因为它变得太慢。 问题答案: 假设是一个字段: 默认情况下,该功能会删除时间部分,因此您可以在今天早晨午夜12点前使用该功能。 如果您特别想坚持使用,而不是,则可以执行以下操作: 是包容性的,因此

  • 问题内容: 我在MySql 5中有一个电话号码表。简单的结构是 记录如下 我需要对这些数据进行排序,并将连续的数字块分组为数字范围。我愿意在C#LINQ中实现该解决方案,但服务器端MySql是一等奖。MySql中是否有一种方法可以汇总此数据,以便输出如下所示? 问题答案: 有一个简单的技巧可以将连续的条目折叠成一个组。如果按(row_number-entry)进行分组,则连续的条目将在同一组中结束

  • 问题内容: 我有以下数据: 我正在尝试编写一个查询,该查询选择与某个日期匹配的所有记录,但是我正在为该字段使用时间戳记,无论我如何尝试,我的查询都不会产生任何结果。 SQL :我尝试了以下查询,但没有任何结果 1。 2。 3。 仅当我将整个日期值设置为时,它才起作用; 问题答案: 尼古拉斯·克拉斯诺夫(Nicholas Krasnov)提供的答案