使用 Oracle SQL 仅计算原始秒数

Posted

技术标签:

【中文标题】使用 Oracle SQL 仅计算原始秒数【英文标题】:Count only original seconds with Oracle SQL 【发布时间】:2020-11-11 15:44:32 【问题描述】:

我有一个具有这种结构和数据的表,其中包含音频/视频的开始和停止位置。我必须计算原始秒数并丢弃非原始秒数。

例如

    CUSTOMER_ID ITEM_ID CHAPTER_ID  START_POSITION  END_POSITION
A   123456      1       6           0               97
B   123456      1       6           97              498
C   123456      1       6           498             678
D   123456      1       6           678             1332
E   123456      1       6           1180            1190
F   123456      1       6           1190            1206
G   123456      1       6           1364            1529
H   123456      1       6           1530            1531

Original Data

“E”行和“F”行不代表原始秒数,因为“D”行从 678 开始并以 1332 结束,因此我需要创建一组新的行,如下所示:

    CUSTOMER_ID ITEM_ID CHAPTER_ID  START_POSITION  END_POSITION
A   123456      1       6           0               97
B   123456      1       6           97              498
C   123456      1       6           498             678
D   123456      1       6           678             1332
E   123456      1       6           1364            1529
F   123456      1       6           1530            1531

New Result Set

你能帮我解决这个问题吗?

【问题讨论】:

目前还不清楚您如何决定将哪些值用于开始和结束位置。 【参考方案1】:

如果我没听错的话,你可以使用not exists 过滤掉范围包含在另一行范围内的行:

select t.*
from mytable t
where not exists (
    select 1
    from mytable t1
    where 
        t1.customer_id = t.customer_id
        and t1.start_position < t.start_position 
        and t1.end_position   > t.end_position
)

【讨论】:

【参考方案2】:

您可以按如下方式使用自联接:

Select distinct t.* 
  from your_table t
  Left Join your_table tt
    On t.customer_id = tt.customer_id
   And t.item_id = tt.item_id
   And t.chapter_id = tt.chapter_id
   And t.rowid <> tt.rowid
   And t.start_position between tt.start_position and tt.end_position - 1
 Where tt.rowid is null

【讨论】:

以上是关于使用 Oracle SQL 仅计算原始秒数的主要内容,如果未能解决你的问题,请参考以下文章

sassql比较两个时间差

oracle计算时间秒数差

oracle 中将系统时间转换为毫秒的sql 怎么写?

SQL计算时间差

Hive SQL计算5天前的时间戳

sql求时间差,精确到秒分时